2016-06-08 60 views
1

我需要添加一個autoinc字段,即而不是的主鍵。我正在將使用自動增量字段的非常大的生產數據庫遷移到models.UUIDField。我一直在做分段遷移,現在我的所有關係都與兩種字段類型重複。我已準備好進行主鍵交換,但不幸的是,我仍然需要爲舊客戶端保留自動遞增整數字段,因爲它已過時。如何在django中支持AutoField(primary_key = False)?

由於django不允許我使用primary_key=False定義自動字段(儘管在db層完全支持這個),我在尋找一個簡單的解決方案。我最初的策略是簡單地將字段更改爲models.BigIntegerField('GUID', db_index=True, null=True, unique=True),然後使用migrations.RunSQL手動設置默認nextval('my_guid_seq'::regclass)。迄今爲止很好,除非沒有。事實證明,由於我的null=True聲明,ORM層的django正在接管並插入null,這將不允許數據庫層的默認設置執行它的工作。

核心開發人員很快就拒絕這個請求,因爲設計不好,我最明確地同意這一點,但是這裏有非常有效的用例。 https://code.djangoproject.com/ticket/8576

我是一個非常薄弱的​​django開發者,所以我不想在ORM層獲得雜草元編程。這是根據定義的黑客,所以我正在尋找最複雜,創造性的解決方案,讓我圍繞此限制

+0

看起來從 'my_guid_seq' ::您正在使用PostgreSQL,你可以使用編輯遷移postgreql序列regclass的。但如果你更新你的問題並提出你的真正目標,你可以得到一個更好的答案。 – e4c5

+0

@ e4c5我有點害怕標記postgres,因爲那部分工作得很好,我不想分散postgres社區。不幸的是,我的問題在於django的ORM一直在堆棧中。 –

+0

對,如果你能解釋這個excercise的目標,我們可能會找到一種方法 – e4c5

回答

1

您可以繼承AutoField並覆蓋_check_primary_key方法。

from django.db.models.fields import AutoField 


def AutoFieldNonPrimary(AutoField): 

    def _check_primary_key(self): 
     if self.primary_key: 
       return [ 
        checks.Error(
         'AutoFieldNonPrimary must not set primary_key=True.', 
         obj=self, 
         id='fields.E100', 
        ), 
       ] 
      else: 
       return [] 

AutoField源代碼here

+1

錯誤檢查是有原因的,繞過它可能會導致問題。我對Django ORM的內部不夠熟悉,無法預測後果可能是什麼,但我會尋找另一種解決方法。 – evergreen

相關問題