0

这个问题开始......

我的博客有两个主要模型,ArticleLink,两者都是Post. 稍微简化一下,它们看起来像这样:

class Post(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
    post_date = models.DateField(db_index=True, auto_now_add=True)

class Article(Post):
    feature_image = models.FileField(upload_to='feature_images')

class Link(Post):
    link = models.URLField(verify_exists=True)

我想同时收集文章和链接,所以在我看来,我运行Post.objects.order_by('post_date')并很快,我得到了整个列表——但只有在Post. 如果我想在Link实例中使用链接,我不能。

我有主键,所以我应该能够做类似的事情Link.objects.get(pk=item.pk)并被设置——但我必须知道这是 aLink还是Article.

我可以post_type在父模型上创建一个属性并使用子模型的正确模型名称写入它吗?

4

1 回答 1

0

我最终以完全不同的方式解决了这个问题,为 Post 编写了一个自定义管理器:

class PostManager(models.Manager):
    def __get_final(self, pk):
        for k in Post.__subclasses__():
            if k.objects.filter(pk=pk).exists():
                return k.objects.get(pk=pk)
        return None

    def __subclass_queryset(self, qs):
        collection = []
        for item in qs:
            collection.append(self.__get_final(item.pk))
        return collection

    def all(self):
        return self.__subclass_queryset(super(PostManager, self).all())

现在Post.objects.all()(或我添加到管理器的任何其他 QuerySet 操作,如order_by),我将返回所有对象的列表,以及它们的完整特定字段集。(然后我重置了子类的管理器,因此它们不会为日常操作而背负这些额外的查询。)

于 2012-06-02T18:12:45.107 回答