【问题标题】:Why do different Django Models with JSONFields have the same values?为什么具有 JSONFields 的不同 Django 模型具有相同的值?
【发布时间】:2018-06-16 11:15:52
【问题描述】:

我有一个带有 JSONField(仅限 Postgres 字段)的模型:

models.py:

from django.db import models
from django.contrib.postgres.fields import JSONField

class Mod(models.Model):
    data = JSONField(default={ 'name':'Model' })

所以我创建了 2 个模型 - ./manage.py shell

>>> from m3d.models import Mod
>>> m1 = Mod()
>>> m1.save()
>>> m2 = Mod()
>>> m2.data['name'] = 'Model 2'
>>> m2.save()

但它们具有相同的data['name'] 值:

>>> m1.data['name']
'Model 2'
>>> m2.data['name']
'Model 2'

请注意,数据库中的值不同

>>> m1a = Mod.objects.get(pk=m1.pk) # get m1 data from db
>>> m1a.data['name']
'Model'
>>> m2.data['name']
'Model 2'

但变量m1 的值仍然是Model 2

我错过了什么吗?这是我需要解决的某种行为吗?

仅供参考:使用 Django 2.0.1

【问题讨论】:

    标签: django postgresql django-models django-postgresql django-jsonfield


    【解决方案1】:

    documentation 对此进行了介绍。您为字段设置default 的方式不正确:

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

    这是您所看到的行为,您创建的实例之间共享同一个对象,修改一个对象会导致另一个对象也被更改。

    您需要使用可调用对象,例如:

    def get_default_data():
        return { 'name':'Model' }
    
    class Mod(models.Model):
        data = JSONField(default=get_default_data)
    

    【讨论】:

    • 谢谢。那 100% 的工作。我知道我错过了什么。
    猜你喜欢
    • 2020-01-30
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多