Quelle est la meilleure façon de définir un JSONField
pour avoir la valeur par défaut d'une nouvelle liste dans Django
?
Il existe un modèle où l'un des champs est une liste d'éléments. Dans le cas où aucun élément n'est défini, le modèle doit avoir une liste vide.
from Django.models import Model
class MyModel(Model):
the_list_field = JSONField(default=[])
Est-ce la meilleure façon de le faire? Doit-il être changé pour utiliser list
à la place?
Merci!
Selon la documentation Django pour JSONField vous devez en effet utiliser default=list
car en utilisant default=[]
créerait un objet mutable qui est partagé entre toutes les instances de votre champ et pourrait conduire à ce que certains objets n'aient pas de liste vide par défaut.
Veuillez noter que cela ne s'applique pas uniquement à Django.contrib.postgres.fields.JSONField
mais pour tous les autres types d'objets et de fonctions en Python en général .
Citation des documents:
Si vous donnez au champ une valeur par défaut, assurez-vous qu'il s'agit d'un appelable tel que liste (pour un défaut vide) ou d'un appelable qui renvoie une liste (telle qu'une fonction). L'utilisation incorrecte de default = [] crée une valeur par défaut mutable qui est partagée entre toutes les instances de
Utilisez JSONField(default=list)
sur JSONField(default=[])
Utilisez JSONField(default=dict)
sur JSONField(default={})
list
et dict
sont appelables tandis que "[]" ne l'est pas. (Vous ne pouvez pas faire []()
)
Si vous souhaitez instancier certaines données, vous pouvez procéder comme suit:
def jsonfield_default_value(): # This is a callable
return [0, 0] # Any valid JSON, e.g. `return ["A", "B"]` or `return {price: 0}`
class MyModel(Model):
the_list_field = JSONField(default=jsonfield_default_value)