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(),因为我需要Post实例而不是Content实例。我永远不会有根内容对象,每个内容对象都将被子类化,但我不能使用抽象类,因为我想要一个包含所有内容的中央表,然后会有 content_blog 等所有表独特的继承内容。

我也试过这样做

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 回答