我正在尝试编写一个查询来检索至少有一个 post 附加到它的所有类别。换句话说,我想“排除”任何没有任何帖子的类别。
这些是我的Category 和Post 模型:
class Category(models.Model):
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250, unique=True)
class Post(models.Model):
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250, unique=True)
body = models.TextField()
category = models.ForeignKey(Category, blank=True, default="")
这是我在查询中使用的代码,目前它获取所有类别,即使没有“附加”到它:
categories = Category.objects.all()
我想要的是这样的:
categories = Category.objects.filter(
# Only ones that have at least one Post that has it's 'category' field set to it.
)
我已经搜索了文档和其他任何地方,但我找不到解决方案。
请告诉我如何做到这一点。
请您参考如下方法:
您可以使用以下查询:
categories = Category.objects.filter(post__isnull=False).distinct()
这将获取所有 post 不为空的类别。因为,一个类别可能有多个帖子,您将获得具有相同 ID 的重复实例。使用 distinct 删除重复的类别。
请注意,distinct(*fields) 是特定于 postgresql 的。如果您使用不同的数据库,只需使用 distinct()。
