Django外键反向设置计数

时间:2015-01-06 13:44:47

标签: python django django-models

所以,提供这样的代码:

class Category(models.Model):
    parent = models.ForeignKey('self', null=True, blank=True)
    name = models.CharField('name', max_length)

我可能有这样的关系:category_two的父级是category_one,category_three的父级是第2类。

我想过滤掉所有没有孩子的类别。这意味着:

category_three.category_set.count() == 0; # category_three has no children
category_two.category_set.count() != 0; # category_three's parent is category_two

但是当我尝试这个时:

Category.objects.filter(category_set__count=0) # this is the wrong code that won't work
# this would actually gives out the following error message
#Cannot resolve keyword 'category_set' into field. Choices are: category, id, name, parent, parent_id

基本上我想要的是过滤掉所有结束类别,意味着没有任何孩子的类别。

希望我解释清楚。知道怎么做吗?

2 个答案:

答案 0 :(得分:1)

使用__isnull查找:

categories = Category.objects.filter(category__isnull=True)

在关系的上下文中,__isnull=True匹配,如果没有相关对象,__isnull=False匹配,如果至少有一个相关对象。或者,您可以将category__isnull=True替换为category=None,这将生成相同的查询。

答案 1 :(得分:0)

尝试过滤注释:

from django.db.models import Count

categories = Category.objects.annotate(num_children=Count('category_set')).filter(num_children__gt=0)

使用'num_children'字段注释每个类别,该字段是'category_set'字段的计数,然后过滤应该只获得有子项的类别。