2015-12-28 261 views
1

我有以下2個表Django的模型 - 外鍵作爲主鍵

在models.py

class Foo(models.Model): 

    uuid = models.CharField(_('UUID'), primary_key=True, default=uuid4) 

class FooExt(models.Model): 

    uuid = models.ForeignKey(Foo, verbose_name=_('UUID'), primary_key=True) 
    time = models.DateTimeField(_('Create DateTime'), auto_now_add=True) 

基本上,我有FooFooExt。我想要一個FooExt之間的一對一關係。這就是爲什麼我將FooExt的主鍵設置爲Foo的外鍵(不確定這是否是正確的做法)。

現在我在Foo中添加一個條目。 FooExt的條目是否會自動創建?或者,我是否需要手動將條目添加到FooFooExt

我能做些什麼來獲得「自動」添加功能嗎?從概念上講,這兩張表格描述的是同樣的事情,但我不想用額外的信息來污染Foo。所以如果增加到Foo自動創建相應的FooExt會很好。

+0

好了,你可以用'OneToOneField'它們之間,但沒有什麼被自動創建的,你需要做手工。如果所有的'FooExt'信息都屬於'Foo',那麼你不應該把字段分開。它不會讓你的模型「被污染」,並且你可以避免像'foo.fooext.time'這樣的查找,這是非常不必要的。 –

回答

5
  1. 如果你想要一個OneToOne關係,然後利用models.OneToOneField代替models.ForeignKey。有外鍵,你將需要添加unique=True在你FOREIGNKEY:
class Foo(models.Model): 
    uuid = models.CharField(_('UUID'), primary_key=True, default=uuid4) 

class FooExt(models.Model): 
    uuid = models.OneToOneField(Foo, verbose_name=_('UUID'), primary_key=True) 
    time = models.DateTimeField(_('Create DateTime'), auto_now_add=True) 
  • 沒有,當你創建一個沒有得到創造了FooExt條目Foo實例中,您需要手動將條目添加到Foo和FooExt。想想在地方和餐館裏,很多地方都可以成爲餐館,但沒有哪個地方都是餐館。

  • 如果你喜歡裏面,創造了FooExt實例Foo自動添加功能,那麼你就可以重載內創造Foosave方法和保存FooExt情況下也是如此,這樣的事情:

  • class Foo(models.Model): 
    .... 
    .... 
        def save(self, *args, **kwargs): 
         super(Foo, self).save(*args, **kwargs) 
         foo_ext = FooExt() 
         foo_ext.uuid = self 
         foo_ext.save() 
    
    +0

    我不確定你在#3中的含義。我實現了它,它爲我提供了一個無限遞歸,因爲我一次又一次地爲'Foo'調用self.save()。 – user3240688

    +0

    在#3中,我說的是重載保存模型**和** creata並保存'Foo_Ext'模型的save方法(模型中用於保存數據庫內容的方法)。在代碼中更正了'foo_ext.uuid'不僅'foo_ext' –

    2

    看起來Yonsy Solis在保存方法答案中有錯誤(更正),試試這個:

    class Foo(models.Model): 
    .... 
    .... 
        def save(self, *args, **kwargs): 
         super(Foo, self).save(*args, **kwargs) 
         foo_ext = FooExt() 
         foo_ext.uuid = self 
         foo_ext.save()

    一句話:我不能發表評論,所以我決定創建答案

    +0

    在問題中得到了解決,謝謝 –

    +0

    是的,它適用於我。謝謝。只是爲了扮演魔鬼的主張,這種方法有什麼缺點? – user3240688

    +0

    不應該在執行'foo_ext = FooExt()'之前檢查'FooExt'是否已經存在嗎?因爲如果有人創建了一個'Foo',然後更新它,第二次調用'save()'會覆蓋'FooExt'並且新的實例 – user3240688