Django如何使用django model utils通过子类过滤queryset?

时间:2016-05-09 13:08:44

标签: python django django-model-utils

我使用django-model-utils来继承Managers。我想一次只获得一个子类的结果。

managers.py

from model_utils.managers import InheritanceManager
class PostManager(InheritanceManager):
    pass

models.py

from .managers import PostManager
class Post(models.Model):
    title = models.CharField(max_length=20)
    text = models.TextField()
    objects = PostManager()


class ImagePost(Post, models.Model):
    source = models.URLField()
    image = models.ImageField(upload_to="images/%Y/%m/%d")


class VideoPost(Post, models.Model):
    source = models.URLField()

我想返回仅图像类型的结果。通过写一个更简单的查询。

Post.objects.filter(type='image').select_subclasses()

我尝试了什么:

if type == 'image':
    Post.objects.filter(imagepost__isnull=False).select_subclasses()

这有效,但是有点反模式,我不想在每个内容类型的视图中写条件。

有没有比在模型中定义属性或将其转换为管理器方法更好的方法?或者我错过了什么?

1 个答案:

答案 0 :(得分:0)

您是否尝试将课程传递给select_subclasses方法?

Post.objects.select_subclasses(ImagePost)

检查their doc about this feature

修改

我误解了这个问题,但听起来像OP只想Post类型ImagePost。执行select_subclasses(ImagePost)会获取所有内容并将类型为ImagePost的对象转换为ImagePost个实例。解决方案应该简单:

image_posts = ImagePost.objects.all()