2009-07-13 29 views
3

一個一對一的關係我想模型在Django與修訂的文章:如何單程模型在Django

我有以下在我的文章的models.py:

class Article(models.Model): 
    title = models.CharField(blank=False, max_length=80) 
    slug = models.SlugField(max_length=80) 

    def __unicode__(self): 
     return self.title 

class ArticleRevision(models.Model): 
    article = models.ForeignKey(Article) 
    revision_nr = models.PositiveSmallIntegerField(blank=True, null=True) 
    body = models.TextField(blank=False) 

在artlcle模型我希望對修訂有2個直接引用 - 一個將指向已發佈的修訂,另一個指向正在積極編輯的修訂。然而,據我所知,OneToOne和ForeignKey引用在模型引用的另一側生成反向引用,所以我的問題是,我如何在Django中創建單向一對一引用?

是否有一些特殊的咒語呢,還是我不得不通過將狀態包含到要求在特定狀態下進行修訂的字段的修訂和自定義實現中來僞造它?

編輯:我想,我在解釋我的意圖方面做得有點糟糕。讓我們試試更高的抽象層次:

我最初的目的是實現一種修訂版的文章模型,其中每篇文章可能有多個修訂版,其中一個修訂版可能是「發佈」和一個主動編輯。

這意味着,文章將有一個一對多的關係,修訂和從文章修改兩個單向引用(通過ForeignKey(Article)參考ArticleRevision類來表示):published_revision

我的問題主要是,我怎樣才能用Django的ORM建模。

+0

並非真正的答案,但已經有一些Django模型版本的解決方案,例如, django-reversion(http://code.google.com/p/django-reversion)或AuditTrail(http://code.djangoproject.com/wiki/AuditTrail)。也許其中一個適合你的需求,你不必重新發明輪子:-) – 2009-07-13 19:51:29

+0

我不想自動版本化我的模型(這是這兩個)。我正在尋找更多的是「手動」修訂,其中文章修訂是一篇文章,直到它發佈。對已發佈文章的任何編輯都會創建一個新版本。發佈新版本會鎖定這個版本,並將其設置爲已發佈的版本,並且對文章的下一次編輯將重新重複編輯發佈週期(我個人認爲這對於普通用戶來說更容易管理,而不是「每個編輯都是修訂版」 「方法)。 – 2011-02-07 11:24:35

回答

4

Django生成的反向引用是編程式的,並且不會影響底層的數據庫模式。換句話說,如果您的文章上有一對一或外鍵字段指向您的版本,則列將被添加到數據庫中的文章表中,但不會添加到版本表中。

因此,從文章的修訂中刪除反向關係是不必要的。如果您真的對此感到強烈,並且想要在代碼中記錄從未使用過反向鏈接,那麼相當常見的Django習慣用法是爲這些字段指定一個related_name屬性,如_unused_1。所以,你的文章模型可能如下所示:

class Article(models.Model): 
    title = models.CharField(blank=False, max_length=80) 
    slug = models.SlugField(max_length=80) 
    revision_1 = models.OneToOneField(ArticleRevision, related_name='_unused_1') 
    revision_2 = models.OneToOneField(ArticleRevision, related_name='_unused_2') 

    def __unicode__(self): 
     return self.title 

這就是說,它是罕見的,一比一的關係是在應用程序中真正有用的(除非你優化出於某種原因),我會建議仔細檢查你的數據庫模式,以確保這真的是你想要的。將ArticleRevision上的單個ForeignKey字段保留爲指向Article(因爲ArticleRevision將可能總是需要與某個Article相關聯),並向Revision添加另一個列,以指示它是否已發佈。

4

雙向鏈接有什麼問題?我會認爲OneToOneField將是這裏的完美選擇。有沒有一個特定的原因,爲什麼這會損害您的應用程序?如果你不需要反向引用,爲什麼你不能忽略它?

+2

如果您需要指向兩個不同的ArticleRevision模型,related_name參數將解決表中的任何問題。這將是我的答案。 – AlbertoPL 2009-07-13 19:21:46