web-dev-qa-db-fra.com

Comment définir la valeur par défaut d'un JSONField sur une liste vide dans Django et Django-jsonfield?

Question

Quelle est la meilleure façon de définir un JSONField pour avoir la valeur par défaut d'une nouvelle liste dans Django?

Le contexte

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.

Solution actuelle

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!

22
Juan Carlos Coto

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

40
jnns

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)
5
Nitin Nain