2012-05-10 9 views
1

は、次のモデルを考える:継承された/子オブジェクトの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インスタンスでは使用できません。私はこれまでルートコンテンツオブジェクトを持っていません。すべてのコンテンツオブジェクトはサブクラス化されますが、抽象クラスは使用できません。すべてのコンテンツを含む中央テーブルを必要とし、すべてのコンテンツテーブルコンテンツのユニークな継承された部分。

また、私はこの

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

をやってみましたが、それは私の知る限り言うことができるよう無残に失敗しました。

答えて

1

返すようにモデルをブログにメソッドを追加することができます最も簡単な方法ポストクエリーセット:

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

問題はありますかすべてのサブモデルにメソッドを追加する必要があります。 related_nameは、抽象基本クラスでのみ動作するようです。

+0

私は本当に回避策を見たいと思っています。しかし、これは最も有望な、単純な答えのように見えます。この問題は、Blog(またはそのハードコーディングされたもの)でのみ機能します。投稿はブログとフォーラムの両方に属している可能性があります。 – 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オブジェクトを返さないことを除いて動作します。私の全面的な問題であるContentオブジェクトを返します。 – Adam

関連する問題