2010-06-30 84 views
4

我有一个模型,如下所示:Django的自递归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) 

它的工作原理是这样,一个活动可以链接到自身和家长的活动被称为“活动”和儿童活动/活动将被称为'任务/任务'

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

感谢您的帮助。

回答

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,但我不记得或快速谷歌它的语法现在。

+0

行得相当工作,我怎么想它。 活动可以有0个或更多'任务',任务也可以有0个或更多'子任务'。所有这些都发生在同一张桌子里。 如果活动不是“子”元素,则该活动只是一项活动 如果任务是活动的“子”元素,则该任务为任务。 我希望我有道理!我知道这可以做到,但不知道如何。 – ninja123 2010-06-30 20:10:14

+0

实际上它做一些tweeks后的工作......把它改为: annotated_qs = Activity.objects.annotate(num_parent =计数( '活动')) 活动= annotated_qs.filter(num_parent = 0) 任务= annotated_qs。滤波器(num_parent__gt = 0) – ninja123 2010-06-30 20:32:08

1

要获得所有顶级活动:

Activity.objects.filter(activity__isnull=True) 

这是抓住具有高于他们没有父活动的所有活动。

要获得所有任务,子任务等。(那些具有高于他们父母的活动):

Activity.objects.filter(activity__isnull=False)