Python 如何在Django和Django JSONField中将JSONField的默认值设置为空列表? 问题:
在Python 如何在Django和Django JSONField中将JSONField的默认值设置为空列表? 问题:,python,django,django-models,reference,Python,Django,Django Models,Reference,在django中设置新列表的默认值的最佳方法是什么 上下文 有一个模型,其中一个字段是项目列表。如果未设置任何项,则模型应具有空列表 当前解决方案 这是最好的方法吗?是否应改为使用列表 谢谢 根据标准,您确实应该使用default=list 因为使用default=[]将创建一个可变对象,该对象在字段的所有实例之间共享,并可能导致某些对象的默认列表不是空的 请注意,这不仅适用于django.contrib.postgres.fields.JSONField,而且适用于所有其他类型的对象和函数 引
django
中设置新列表的默认值的最佳方法是什么
上下文
有一个模型,其中一个字段是项目列表。如果未设置任何项,则模型应具有空列表
当前解决方案
这是最好的方法吗?是否应改为使用列表
谢谢 根据标准,您确实应该使用default=list
因为使用default=[]
将创建一个可变对象,该对象在字段的所有实例之间共享,并可能导致某些对象的默认列表不是空的
请注意,这不仅适用于django.contrib.postgres.fields.JSONField
,而且适用于所有其他类型的对象和函数
引用文件:
如果给字段一个默认值,请确保它是一个可调用的字段,例如list(对于空的默认值)或返回列表的可调用字段(例如函数)。错误地使用default=[]会创建一个可变的默认值,该默认值在的所有实例之间共享
list
和dict
是可调用的,而[]
和{}
不是(您不能执行[]()
)。因此:
- 使用
覆盖JSONField(默认值=列表)
JSONField(默认值=[])
- 使用
覆盖JSONField(默认值=dict)
JSONField(默认值={})
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)
有什么理由不使用Django的内置jsonfield吗?@RodXavier MySQL<5.7和其他遗留代码使用它们,以保持一致性。
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)