如何在Django和django-jsonfield中将JSONField的默认值设置为空列表?

时间:2017-02-15 02:47:04

标签: python django django-models reference

问题

JSONField设置为django中新列表的默认值的最佳方法是什么?

上下文

有一个模型,其中一个字段是项目列表。在没有设置项目的情况下,模型应该有一个空列表。

当前解决方案

from django.models import Model

class MyModel(Model):
    the_list_field = JSONField(default=[])

这是最好的方法吗?是否应切换为使用list

谢谢!

2 个答案:

答案 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={})

listdict是可调用的,而“ []”则不可。 (您不能做[]()


如果要实例化某些数据,可以执行以下操作:

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)