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

Jua*_*oto 17 python django reference django-models

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

上下文

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

当前解决方案

from django.models import Model

class MyModel(Model):
    the_list_field = JSONField(default=[])
Run Code Online (Sandbox Code Playgroud)

这是最好的方法吗?它应该转换为使用list吗?

谢谢!

jnn*_*nns 35

根据JSONFieldDjango文档,您确实应该使用,default=list 因为using default=[]会创建一个在您的字段的所有实例之间共享的可变对象,并且可能导致某些对象没有空列表作为默认值.

请注意,这不仅适用于Python中的django.contrib.postgres.fields.JSONField所有其他类型的对象和函数.

从文档引用:

如果为该字段指定默认值,请确保它是可调用的,例如list(对于空的默认值)或可调用的返回列表(例如函数).错误地使用default = []会创建一个在所有实例之间共享的可变默认值


Nit*_*ain 24

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)
Run Code Online (Sandbox Code Playgroud)