问题
在django中将JSONField设置为新列表的默认值的最佳方法是什么
上下文
有一个模型,其中一个字段是一个项目列表。在没有设置项目的情况下,模型应该有一个空列表。
当前解决方案
from django.models import Model
class MyModel(Model):
the_list_field = JSONField(default=[])这是最好的方法吗?是否应该改为使用list?
谢谢!
发布于 2017-03-15 17:00:48
根据Django documentation for JSONField的说法,您确实应该使用default=list,因为使用default=[]将创建一个在字段的所有实例之间共享的可变对象,并且可能导致某些对象没有默认的空列表。
请注意,这不仅适用于django.contrib.postgres.fields.JSONField,也适用于所有其他类型的对象和函数in Python in general。
引用自文档:
如果您为字段提供了默认值,请确保它是可调用的,如list (表示空默认值)或返回列表的可调用对象(如函数)。错误地使用default=[]会创建一个在所有
实例之间共享的可变缺省值
发布于 2019-11-15 22:11:05
list和dict是可调用的,而[]和{}是不可调用的(您不能调用[]())。所以:
通过JSONField(default=[])
JSONField(default=dict)和JSONField(default={})
使用JSONField(default=list)的
如果您想实例化一些数据,您可以执行以下操作:
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)https://stackoverflow.com/questions/42239818
复制相似问题