Django在ManyToMany计数上过滤模型?

时间:2011-10-25 02:01:27

标签: django django-models django-queryset

假设我的models.py中有类似的东西:

class Hipster(models.Model):
  name = CharField(max_length=50)

class Party(models.Model):
  organiser = models.ForeignKey()
  participants = models.ManyToManyField(Profile, related_name="participants")

现在在我的views.py中,我想做一个查询,为有超过0个参与者的用户取一个派对。

这样的事情可能是:

user = Hipster.get(pk=1) 
hip_parties = Party.objects.filter(organiser=user, len(participants) > 0)

最好的方法是什么?

4 个答案:

答案 0 :(得分:105)

如果这样可行,我就是这样做的。

最好的方式可能意味着很多东西:最佳性能,最易维护等等。因此我不会说这是最好的方法,但我喜欢尽可能多地坚持ORM功能,因为它似乎更易于维护。

from django.db.models import Count

user = Hipster.objects.get(pk=1) 
hip_parties = (Party.objects.annotate(num_participants=Count('participants'))
                            .filter(organiser=user, num_participants__gt=0))

答案 1 :(得分:31)

Party.objects.filter(organizer=user, participants__isnull=False)
Party.objects.filter(organizer=user, participants=None)

答案 2 :(得分:4)

exclude更容易:

# organized by user and has more than 0 participants
Party.objects.filter(organizer=user).exclude(participants=None)

还会返回不同的结果

答案 3 :(得分:1)

来自@ Yuji-'Tomita'-Tomita的答案,我还添加了.distinct('id')来排除duplitate记录:

Party.objects.filter(organizer=user, participants__isnull=False).distinct('id')

因此,每一方只列出一次。