簡體   English   中英

在遷移文件中正確聲明空Django PostgreSQL JSONField默認值

[英]Proper declaration of an empty Django PostgreSQL JSONField default value in migration file

我有點迷失了解釋Django對PostgreSQL JSONField應用默認值解釋:

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

所以在我的模型文件中,我已經聲明了默認值

foo = JSONField(default=dict())

但是,當我為新字段生成遷移操作時,這就是結果

migrations.AddField(
    model_name='bar',
    name='foo',
    field=django.contrib.postgres.fields.jsonb.JSONField(default={}))

我只是不確定這個結果是否符合文檔的建議。 這是有效的,還是應該修改生成的默認值來調用dict()

可調用的可以 調用的對象x ,因此x()是有效的,並且不會引發錯誤,因為它不可調用(盡管在調用期間可能存在錯誤,例如因為函數某處產生錯誤)。

dict()實際上完全等同{} ,它不是可調用的,因為{}()不會導致構造任何東西。 但另一方面, dict本身是對dict類的引用,如果我們稱之為,我們構造一個新的 dict 所以我們應該寫它:

# no brackets! We do not make a call, but pass the callable
foo = JSONField(default=dict)

所以我們調用dict類,我們傳遞對類的引用 ,這些類是可調用的:如果你調用它們,通常構造一個新實例(盡管可以改變這種行為)。

傳遞callable在這里至關重要,因為否則Django每次都會使用對同一個字典的引用。 因此,更改其中一個詞典將更改其他更改引用的詞典。 如果你存儲字典並重新加載它,那么這將是一個不同的字典,但只要你構建了兩個模型,在同一個Python運行期間,這些將是相同的對象。

但是,如果您傳遞一個函數,則會調用該函數,從而生成兩個不同的對象,都是空字典。 但是第一本字典的更改不會反映在第二本字典中。

如果您想要使用包含數據的字典初始化JSON字段,而不是編寫default={'a': 4} ,則必須將其定義為:

def default_somemodel_dict():
    return {'a': 4}

class SomeModel(models.Model):
    foo = JSONField(default=default_somemodel_dict)

暫無
暫無

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

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