2012-05-10 60 views
1

鑑於以下型號:如何覆蓋inherited/child對象中的related_name?

class Module(models.Model): 
    pass 
class Content(models.Model): 
    module = models.ForeignKey(Module, related_name='contents') 

class Blog(Module): 
    pass 
class Post(Content): 
    pass 

我希望能夠得到通過博客做類似擁有的所有的「郵報」的對象:

b = Blog.objects.get(pk=1) 
b.posts.all() 

不過,我還沒有想出這是一個很好的方法。我不能使用b.contents.all(),因爲我需要Post實例,而不是Content實例。我永遠不會擁有一個根內容對象,每個內容對象都將被分類,但是我不能使用抽象類,因爲我想要一箇中心表,其中包含我的所有內容,然後會有content_blog等所有表獨特的遺傳內容。

我也試着這樣做

class Content(models.Model): 
    module = models.ForeignKey(Module, related_name='%(class)') 

但慘遭失敗,據我可以告訴。

回答

1

最簡單的方法可以添加一個方法到博客模型返回Post queryset,像這樣:

class Blog(Module): 
    def _get_posts(self): 
     return Post.objects.filter(module=self) 
    posts = property(_get_posts) 

問題是喲你必須爲每個子模型添加方法。 related_name似乎只適用於抽象基類。

+0

尚未接受,因爲我真的希望看到解決方法。但是這看起來像是最有前途的,但很簡單的答案。與此相關的一個問題是它只適用於博客(或任何其硬編碼)。 Post可能同時屬於博客和論壇等。 – Adam

+0

雖然,在查詢像related_name時,這不起作用。 – benselme

0

該解決方案在我腦海中:

# ... 

class Blog(Module): 
    @property 
    def posts(self): 
     return self.contents 

class Post(Content): 
    pass 

這樣,做blog.posts是一樣的做blog.contents

>>> blog = Blog.objects.get(pk=1) 
>>> blog.posts.all() 
# [ ... ] 
+0

這將工作,但不會返回Post對象。它將返回內容對象,這是我的整個問題。 – Adam