提取在django中具有许多与许多2相关的对象的对象

时间:2018-08-26 10:01:08

标签: django django-models

帖子可能被分配到一个或多个类别,并且类别可能包含多个帖子。

这是我的模特:

class Category(models.Model):
    name = models.CharField(max_length=31)


class Post(models.Model):
    title = models.CharField(max_length=127)
    content = models.TextField()
    category = models.ManyToManyField(Category)

我不知道如何获取分配了至少一个帖子的所有类别,而不查询所有类别并进行循环检查。

2 个答案:

答案 0 :(得分:2)

您可以在反向管理器中使用isnull查找:

Category.objects.filter(post__isnull=False)

答案 1 :(得分:2)

以下查询将解决问题:

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

过滤器将在{{1}上执行LEFT OUTER JOIN(由于__isnull应该为False,因此优化为简单的JOIN) }表,因此将保留post_category不是JOIN的所有post_id行。

如果该类别具有多个相关的NULL,则.distinct()是必需的(当然不是严格必须的),以避免多次返回 same Category 。该查询将在Post表上进行JOIN,因此通过使用post_category就像乘数一样,我们可以避免这种情况。

相反:类别 a .distinct()不需要此Post,因为.distinct()行仅在以下情况出现一次没有实际职位:

NULL