为什么带有JSONField的不同Django模型具有相同的值?

Jer*_* S. 3 django postgresql django-models django-postgresql django-jsonfield

我有一个带有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' })
Run Code Online (Sandbox Code Playgroud)

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

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

但他们有相同的data['name']价值观:

>>> m1.data['name']
'Model 2'
>>> m2.data['name']
'Model 2'
Run Code Online (Sandbox Code Playgroud)

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

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

但变量m1仍具有价值Model 2.

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

仅供参考:使用Django 2.0.1

sol*_*oke 13

这在文档中有所涉及.您default为字段设置的方式不正确:

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

这是您所看到的行为,在您创建的实例之间共享同一个对象,在另一个结果中修改一个结果也会被更改.

你需要使用一个可调用的,例如:

def get_default_data():
    return { 'name':'Model' }

class Mod(models.Model):
    data = JSONField(default=get_default_data)
Run Code Online (Sandbox Code Playgroud)