我有一个带有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
答案 0 :(得分:9)
documentation中介绍了这一点。您为字段设置default
的方式不正确:
如果您为该字段指定默认值,请确保它是可调用的,例如
dict
(对于空默认值)或可调用的返回dict
(例如函数)。使用default={}
错误地创建了一个在JSONField的所有实例之间共享的可变默认值。
这是您所看到的行为,在您创建的实例之间共享同一个对象,在另一个结果中修改一个结果也会被更改。
您需要使用可调用的内容,例如:
def get_default_data():
return { 'name':'Model' }
class Mod(models.Model):
data = JSONField(default=get_default_data)