在Django中,如何获取模型的所有实例,并使用ForeignKey字段将其相关模型的其他实例附加到该模型中?

问题描述:

我正在尝试编写一个查询,该查询检索至少包含一个附加到其上的一个post的所有类别。换句话说,我想'排除'没有任何帖子的任何类别。在Django中,如何获取模型的所有实例,并使用ForeignKey字段将其相关模型的其他实例附加到该模型中?

这些都是我的模型CategoryPost

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. 
) 

我搜索了文档和其他地方,但我找不到解决方案。

请让我知道如何做到这一点。

+0

'Post'模型具有'Topic'模型的外键,并且您将其称为'categories'。我不确定我是否理解这种关系与“类别”模型的关系。 – AKS

+0

@AKS对不起,我感到困惑。我在问题中用主题替换了主题,认为这会让我更加清楚自己想要实现的目标。我现在修好了,谢谢。 –

+0

请检查答案。 – AKS

您可以使用下面的查询:

categories = Category.objects.filter(post__isnull=False).distinct() 

这将让所有的类别中,post不为空。由于一个类别可能有多个帖子,因此您将获得具有相同ID的重复实例。以distinct删除重复的类别。

请注意,该distinct(*fields)是postgresql特定的。如果您使用的是其他数据库,请使用distinct()

+0

我收到以下错误代码: NotImplementedError at/ DISTINCT ON字段不受此数据库后端支持。 删除.distince('id')在最后摆脱了错误,但它得到重复的实例,因为你已经提到过。 –

+0

我明白了。在字段中使用'distinct'纯粹是postgresql特有的,看起来你正在使用不同的数据库。你可以使用'distinct()'而不用任何字段。 – AKS

+0

我正在使用SqlLite。使用distinct()修复了这个问题。非常感谢! –

通过查询不同类别的Post获取所有唯一类别ID,然后通过ID筛选类别。

id_list = Post.objects.values_list('category_id').distinct() 
catgories = Category.objects.filter(id__in=id_list)