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



问题

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=[] 会创建一个可变的默认值,该默认值在所有实例之间共享

listdict是可调用的,而[]{}不是(你不能做[]()(。所以:

  • 使用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)

相关内容

  • 没有找到相关文章

最新更新