2011-09-29 89 views
4

我想模仿使用django的generic relations繼承模型。到目前爲止,這是我想出:django通用一對一的關係,級聯刪除

class Base(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey() 
    ... other stuff 

    class Meta: 
    unique_together = ("content_type", "object_id") 

class SubClass1(models.Model): 
    ... properties for this class 

    _base = generic.GenericRelation(Base) 

    @property 
    def base(self): 
    return self._base.all()[0] 

從你可以看到這裏(希望,至少),該SubClass1應該有Base一比一的關係,這是爲什麼我完成了創建_base字段的所有工作,然後使用base屬性覆蓋它。具有這種通用關係將自動連接級聯刪除,這是我想要的(並且我有一個post-delete信號將從另一個方向連接刪除)。

Base可能有任何數量的子類,並且讓我感到毛骨悚然的事情是不得不復制&粘貼_base及其覆蓋屬性。我也有一個自定義的對象管理器,可以和其他東西一樣,基本上應該在Base的每個子類中都表現相同。

是否有一個很好的方法來封裝這個通用的功能,所以我不必複製&粘貼它爲每個子類?

回答

2

爲什麼不能有一個BaseSubClass,然後從那裏繼承。所以根據你的例子:

class BaseSubClass(models.Model): 
    _base = generic.GenericRelation(Base) 

    class Meta: 
     abstract = True 

    @property 
    def base(self): 
     return self._base.all()[0] 

class SubClass1(BaseSubClass): 
    # fields 
+0

我最初做到了這一點,但不喜歡模型框架建立數據庫的方式...然後,當我建立一個例子來解釋我爲什麼不接受你的答案我記得抽象基類,並在Meta類中增加了'abstract = True'屬性,它看起來很完美! –

+0

你說得對。我其實打算加上'abstract = True',但是完全忘了。我相應地更新了我的答案。 –

相關問題