¿Cuál es la mejor manera de configurar un JSONField para que tenga el valor predeterminado de una nueva lista en django ?
Hay un modelo en el que uno de los campos es una lista de elementos. En el caso de que no haya elementos establecidos, el modelo debe tener una lista vacía.
from django.models import Model class MyModel(Model): the_list_field = JSONField(default=[]) ¿Es esta la mejor manera de hacerlo? ¿Debería cambiarse a list de uso en su lugar?
¡Gracias!
De acuerdo con la documentación de Django para JSONField , debería usar default=list porque usar default=[] crearía un objeto mutable que se comparte entre todas las instancias de su campo y podría hacer que algunos objetos no tengan una lista vacía por defecto.
Tenga en cuenta que esto no solo se aplica a django.contrib.postgres.fields.JSONField sino a todos los demás tipos de objetos y funciones en Python en general .
Cita de los documentos:
Si le da al campo un valor predeterminado, asegúrese de que sea una lista invocable (para un valor predeterminado vacío) o una invocable que devuelva una lista (como una función). El uso incorrecto de default=[] crea un valor predeterminado mutable que se comparte entre todas las instancias de
list y dict son invocables, mientras que [] y {} no lo son (no puede hacer []() ). Asi que:
JSONField(default=list) sobre JSONField(default=[])JSONField(default=dict) sobre JSONField(default={})Si desea crear una instancia con algunos datos, puede hacer lo siguiente:
def jsonfield_default_value(): # This is a callable return [0, 0] # Any serializable Python obj, eg `["A", "B"]` or `{"price": 0}` class MyModel(Model): the_list_field = JSONField(default=jsonfield_default_value)