Skip to main content
 首页 » 编程设计

python之在 Django 中,如何获取一个模型的所有实例,这些实例具有使用 ForeignKey 字段附加到它的相关模型的其他实例

2024年10月01日39Terrylee

我正在尝试编写一个查询来检索至少有一个 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()。