2010-06-30 86 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)