2

次のモデルがあるとします。

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()が必要なため、使用できません。ルート コンテンツ オブジェクトはありません。すべてのコンテンツ オブジェクトがサブクラス化されますが、すべてのコンテンツを含む中央のテーブルが必要なため、抽象クラスを使用できません。すべての content_blog などのテーブルが存在します。独自の継承されたコンテンツ。PostContent

私もこれをやってみました

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

しかし、私が知る限り、それは惨めに失敗しました。

4

2 に答える 2

2

最も簡単な方法は、Blog モデルにメソッドを追加して、次のように Post クエリセットを返すことです。

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

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

于 2012-05-10T04:04:44.643 に答える
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()
# [ ... ]
于 2012-05-10T03:45:04.713 に答える