2012-02-06 63 views
2

因此,我有下面表示的4個實體,這些實體在我的應用程序中是強壯和獨立的實體,現在問題是每個文章或圖片都可以用演示者或事件「標記」他們是其中4個可能變得更加複雜的獨立實體。將事件和演示者字段添加到文章和圖片或相反,特別是因爲它們可能沒有標記,這看起來不正確。
從長遠來看,其他實體可能需要加標籤並可能出現其他可標記的實體。在Django中的通用many2many關係

class Article(models.Model): 
    #Fields 
class Picture(models.Model): 
    #Fields 
class Presenter(models.Model): 
    # Fields 
class Event(models.Model): 
    # Fields 

越接近我得到的是某種雙頭通用的contentType基於中間模型是這樣的(尚未對其進行測試,因爲它是比這更復雜一點),但我期待的想法:

class GenericTag(models.Model): 
    # Event,Presenter instance.. 
    tagcontent_type = models.ForeignKey(ContentType) 
    tagobject_id = models.PositiveIntegerField() 
    tagcontent_object = generic.GenericForeignKey('tagcontent_type', 'tagobject_id') 
    # Picture,Article instance 
    objcontent_type = models.ForeignKey(ContentType) 
    objobject_id = models.PositiveIntegerField() 
    objcontent_object = generic.GenericForeignKey('objcontent_type', 'objobject_id') 

有了這樣只是做根據我掌握的信息查詢,我覺得必須要更優雅的方式來做到這一點沒有餡的所有tagmodels作爲字段爲taggablemodels。

+0

它是多對多關係還是一對多?從你的問題看來,文章或圖片看起來只能有一個演示者和一個事件,但標題上寫着「many2many」。 – 2012-02-07 10:53:14

+0

一張圖片可以有幾個演示者,一個演示者可以在幾張圖片中,文章和事件相同。 – 2012-02-07 10:55:40

回答

2

一種不同的方法而無需通用外鍵是使用模型繼承:

class Tag(models.Model): 
    pass 
class Taggable(models.Model): 
    pass 

class Article(Taggable): 
    # Fields 
class Picture(Taggable): 
    # Fields 
class Presenter(Tag): 
    # Fields 
class Event(Tag): 
    # Fields 

class TagInstance(models.Model): 
    tagged = models.ForeignKey(Taggable) 
    tag = models.ForeignKey(Tag) 

這引入了對兩個基類額外的表和它們的各自的實例共享主鍵的空間,因此它們可以被引用與普通的外鍵。這可能是合理的,取決於你想要用你的標籤做甚麼。

+0

我不喜歡這個解決方案的部分是那4個實體需要繼承(Tag | Taggable)才能工作,並且因爲它們是屬於他們自己的應用的實體,所以它們不適合我的模型 – 2012-02-07 12:13:05