Django自递归ManyToManyField筛选器查询

Django自递归ManyToManyField筛选器查询,django,filter,lookup,self,manytomanyfield,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) 它的工作原理是这样的,活动可以链接到

我有一个这样的模型:

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)  
它的工作原理是这样的,活动可以链接到自身,父活动称为“活动”,子活动称为“任务”

如何筛选模型以获取所有“活动”,如何筛选模型以获取所有“任务”

谢谢你的帮助

给你:

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


如果您使用
\uu is\u null=True
,您可以在没有注释的情况下使用更好的性能,但我现在无法回忆或快速搜索它的语法。

要获取所有顶级活动:

Activity.objects.filter(activity__isnull=True)
这将捕获上面没有父活动的所有活动

要获取所有任务、子任务等(上面有父活动的任务、子任务等),请执行以下操作:


按我的要求做得很好。活动可以有0个或多个“任务”,任务也可以有0个或多个“子任务”。所有这些都发生在同一个表中。活动只有在不是“子”元素时才是活动如果任务是活动的“子”元素时才是任务。我希望我说的有道理!我知道这是可以做到的,但不知道是怎么做到的。事实上,在做了一些Tweek之后,它起了作用。。。将其更改为:annotated_qs=Activity.objects.annotate(num_parent=Count('Activity'))activities=annotated_qs.filter(num_parent=0)tasks=annotated_qs.filter(num_parent=0)
Activity.objects.filter(activity__isnull=False)