Django自递归ManyToManyField过滤查询

时间:2010-06-30 18:00:47

标签: django filter lookup self manytomanyfield

我有一个这样的模型:

class Activity(models.Model):  
    title = models.CharField(max_length=200)
    summary = models.TextField(null=True, blank=True)  
    tasks = models.ManyToManyField('self', symmetrical=False, null=True, blank=True)  

它的工作方式如下,一个活动可以链接到自身,父活动称为“活动”,子活动/活动将被称为“任务/任务”

如何过滤模型以获取所有“活动”以及如何过滤模型以获取所有“任务”?

感谢所有帮助。

2 个答案:

答案 0 :(得分:1)

你走了:

from django.db.models import Count

annotated_qs = Activity.objects.annotate(num_tasks=Count(tasks))

activities = annotated_qs.objects.filter(num_tasks=0)
tasks = annotated_qs.objects.filter(num_tasks__gt=0)

:)

如果你使用__is_null=True,你可以在没有注释的情况下获得更好的性能,但我现在无法回想起或快速谷歌它的语法。

答案 1 :(得分:1)

获取所有顶级活动:

Activity.objects.filter(activity__isnull=True)

这是抓住所有没有父活动的活动。

获取所有任务,子任务等(那些父项活动高于它们的那些):

Activity.objects.filter(activity__isnull=False)