簡體   English   中英

Django 1.9 JSONField更新行為

[英]Django 1.9 JSONField update behavior

我最近更新到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())

這是我正在做的一個例子:

>>> 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'

似乎每當我更新my_data任何字段時,我創建的下一個對象都會預先填充來自前一個對象的my_data的數據。 出現這種情況我是否使用get_or_create或者只是create 有人可以向我解釋發生了什么嗎?

問題是你使用的是default=dict() Python字典是可變的。 加載模型文件時,將創建一次默認字典。 之后,如果instance.my_data使用默認值,則對instance.my_data任何更改都會更改同一實例。

解決方案是使用可調用的dict作為默認值而不是dict()

class Activity(models.Model):
    my_data = JSONField(default=dict)

JSONField文檔警告過:

如果為字段指定default ,請確保它是可調用的,例如dict (對於空默認值)或可調用的返回dict (例如函數)。 錯誤地使用default={}會創建一個在JSONField所有實例之間共享的可變默認值。

from django_postgres_extensions.models.expressions import Key
obj = Product.objectsannotate(Key('description', 'Details')).get()
obj = Product.objects.annotate(Key('description', 'Details__Rating')).get()
obj = Product.objects.annotate(Key('description', 'Tags__1')).get()

Product.objects.update(description__ = {'Industry': 'Movie', 'Popularity': 'Very Popular'})

Product.objects.update(description__del ='Details')
Product.objects.update(description__del = 'Details__Release')
Product.objects.update(description__del='Tags__1')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM