use*_*013 7 python django postgresql json
我最近更新到Django 1.9并尝试更新我的一些模型字段以使用内置的JSONField(我正在使用PostgreSQL 9.4.5).当我试图创建和更新我的对象的字段时,我遇到了一些特殊的东西.这是我的模型:
class Activity(models.Model):
activity_id = models.CharField(max_length=MAX_URL_LENGTH, db_index=True, unique=True)
my_data = JSONField(default=dict())
Run Code Online (Sandbox Code Playgroud)
这是我正在做的一个例子:
>>> from proj import models
>>> test, created = models.Activity.objects.get_or_create(activity_id="foo")
>>> created
True
>>> test.my_data['id'] = "foo"
>>> test.save()
>>> test
<Activity: {"id": "foo"}>
>>> test2, created2 = models.Activity.objects.get_or_create(activity_id="bar")
>>> created2
True
>>> test2
<Activity: {"id": "foo"}>
>>> test2.activity_id
'bar'
>>> test.activity_id
'foo'
Run Code Online (Sandbox Code Playgroud)
似乎每当我更新任何字段时my_data,我创建的下一个对象都会预先填充my_data来自前一个对象的数据.出现这种情况我是否使用get_or_create或只create.有人可以向我解释发生了什么吗?
Ala*_*air 20
问题是你正在使用default=dict().Python字典是可变的.加载模型文件时,将创建一次默认字典.之后instance.my_data,如果使用默认值,则更改同一实例的任何更改.
解决方案是使用callable dict作为默认值而不是dict().
class Activity(models.Model):
my_data = JSONField(default=dict)
Run Code Online (Sandbox Code Playgroud)
该JSONField文档警告一下:
如果给字段a
default,请确保它是可调用的,例如dict(对于空的默认值)或返回adict(例如函数)的可调用对象.错误地使用default={}会创建在所有实例之间共享的可变默认值JSONField.
| 归档时间: |
|
| 查看次数: |
3603 次 |
| 最近记录: |