Django 如何使用 Django 模型实用程序按子类过滤查询集?
Django how to filter queryset by a subclass using django model utils?
我正在使用 django-model-utils 作为继承管理器。我想一次只获取一个子类的结果。
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()
我想 return 只有图像类型的结果。通过像这样编写一个更简单的查询。
Post.objects.filter(type='image').select_subclasses()
我尝试过的:
if type == 'image':
Post.objects.filter(imagepost__isnull=False).select_subclasses()
这可行,但有点反模式,我不想在视图中为每种内容类型编写条件。
是否有更好的方法,例如在模型中定义 属性 或将其转换为管理器方法?还是我遗漏了什么?
您是否尝试过将 class 传递给 select_subclasses
方法?
Post.objects.select_subclasses(ImagePost)
检查their doc about this feature。
编辑:
我误解了这个问题,但听起来 OP 只想要类型为 ImagePost
的 Post
。执行 select_subclasses(ImagePost)
将获取所有内容并将类型为 ImagePost
的对象转换为 ImagePost
实例。解决方案应该很简单:
image_posts = ImagePost.objects.all()
我正在使用 django-model-utils 作为继承管理器。我想一次只获取一个子类的结果。
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()
我想 return 只有图像类型的结果。通过像这样编写一个更简单的查询。
Post.objects.filter(type='image').select_subclasses()
我尝试过的:
if type == 'image':
Post.objects.filter(imagepost__isnull=False).select_subclasses()
这可行,但有点反模式,我不想在视图中为每种内容类型编写条件。
是否有更好的方法,例如在模型中定义 属性 或将其转换为管理器方法?还是我遗漏了什么?
您是否尝试过将 class 传递给 select_subclasses
方法?
Post.objects.select_subclasses(ImagePost)
检查their doc about this feature。
编辑:
我误解了这个问题,但听起来 OP 只想要类型为 ImagePost
的 Post
。执行 select_subclasses(ImagePost)
将获取所有内容并将类型为 ImagePost
的对象转换为 ImagePost
实例。解决方案应该很简单:
image_posts = ImagePost.objects.all()