问题
将JSONField
设置为django
中具有新列表的默认值的最佳方法是什么?
上下文
有一个模型,其中一个字段是项目列表。如果未设置任何项,则模型应具有空列表。
当前解决方案
from django.models import Model
class MyModel(Model):
the_list_field = JSONField(default=[])
这是最好的方法吗?是否应该切换到使用 list
?
谢谢!
根据 JSONField 的 Django 文档,你确实应该使用 default=list
因为使用 default=[]
会创建一个可变对象,该对象在字段的所有实例之间共享,并可能导致某些对象没有空列表作为默认值。
请注意,这不仅适用于django.contrib.postgres.fields.JSONField
,也适用于 Python 中的所有其他类型的对象和函数。
引用文档:
如果为字段指定默认值,请确保它是可调用对象(例如列表((对于空默认值(或返回列表的可调用对象(例如函数(。错误地使用 default=[] 会创建一个可变的默认值,该默认值在所有实例之间共享
list
和dict
是可调用的,而[]
和{}
不是(你不能做[]()
(。所以:
- 使用
JSONField(default=list)
胜过JSONField(default=[])
- 使用
JSONField(default=dict)
胜过JSONField(default={})
如果要使用某些数据进行实例化,可以执行以下操作:
def jsonfield_default_value(): # This is a callable
return [0, 0] # Any serializable Python obj, e.g. `["A", "B"]` or `{"price": 0}`
class MyModel(Model):
the_list_field = JSONField(default=jsonfield_default_value)