【问题标题】:How to set the default of a JSONField to empty list in Django and django-jsonfield?如何在 Django 和 django-jsonfield 中将 JSONField 的默认设置为空列表?
【发布时间】:2017-07-03 13:11:20
【问题描述】:

问题

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

上下文

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

当前解决方案

from django.models import Model

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

这是最好的方法吗?是否应该改为使用list

谢谢!

【问题讨论】:

  • 你有什么理由不使用 Django 的内置 jsonfield 吗?
  • @RodXavier MySQL

标签: python django django-models reference


【解决方案1】:

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

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

引用自文档:

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

【讨论】:

    【解决方案2】:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-09
      • 2013-01-01
      • 2017-05-31
      • 1970-01-01
      • 2019-03-09
      • 2019-10-08
      • 1970-01-01
      • 2017-04-29
      相关资源
      最近更新 更多