3

我将 django-model-utils 用于继承管理器。我想一次只得到一个子类的结果。

管理者.py

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

模型.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()

这可行,但有点反模式,我不想在视图中为每种内容类型编写条件。

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

4

1 回答 1

2

您是否尝试过将类传递给select_subclasses方法?

Post.objects.select_subclasses(ImagePost)

查看他们关于此功能的文档

编辑:

我误解了这个问题,但听起来 OP 只想要Postwith 类型ImagePost。这样做select_subclasses(ImagePost)会获取所有内容并将具有类型的对象转换ImagePostImagePost实例。解决方案应该很简单:

image_posts = ImagePost.objects.all()
于 2016-05-09T14:43:57.540 回答