将JSONField
设置为django
中新列表的默认值的最佳方法是什么?
有一个模型,其中一个字段是项目列表。在没有设置项目的情况下,模型应该有一个空列表。
from django.models import Model
class MyModel(Model):
the_list_field = JSONField(default=[])
这是最好的方法吗?是否应切换为使用list
?
谢谢!
答案 0 :(得分:25)
根据Django documentation for JSONField,您确实应该使用default=list
因为使用default=[]
会创建一个在您的字段的所有实例之间共享的可变对象,并且可能导致某些对象没有空列表作为默认值。
请注意,这不仅适用于django.contrib.postgres.fields.JSONField
,也适用于所有其他类型的对象和功能in Python in general。
来自文档的引用:
如果您为该字段指定默认值,请确保它是可调用的,例如list(对于空的默认值)或可调用的返回列表(例如函数)。错误地使用default = []会创建一个在
的所有实例之间共享的可变默认值
答案 1 :(得分:2)
在JSONField(default=list)
上使用 JSONField(default=[])
在JSONField(default=dict)
上使用 JSONField(default={})
list
和dict
是可调用的,而“ []”则不可。 (您不能做[]()
)
如果要实例化某些数据,可以执行以下操作:
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)