Django在ManyToMany计数上过滤模型?

Ska*_*Ska 63 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")
Run Code Online (Sandbox Code Playgroud)

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

这样的事情可能是:

user = Hipster.get(pk=1) 
hip_parties = Party.objects.filter(organiser=user, len(participants) > 0)
Run Code Online (Sandbox Code Playgroud)

这样做的最佳方式是什么?

sol*_*tic 111

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

最好的方法可能意味着很多东西:最佳性能,最易维护等.因此我不会说这是最好的方法,但我喜欢尽可能多地坚持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))
Run Code Online (Sandbox Code Playgroud)

  • +1,"大于Y","小于X"都包含在这里,而不仅仅是null实际上回答了问题,"Django在ManyToMany计数上过滤模型" (11认同)
  • 这应该是公认的答案. (3认同)
  • @gregoltsov 5年后,这_is_现在接受了答案:) (3认同)

Yuj*_*ita 32

Party.objects.filter(organizer=user, participants__isnull=False)
Party.objects.filter(organizer=user, participants=None)
Run Code Online (Sandbox Code Playgroud)

  • @Yuji,当我这样做时,"participant__isnull = False"将导致重复的条目.你有什么主意吗? (2认同)
  • @crossin 如果查询可能导致重复,请将“.distinct()”附加到您的查询中。 (2认同)

Ars*_*lov 5

使用起来更容易exclude

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

还返回不同的结果


Kos*_*tyn 5

派生自 @Yuji-'Tomita'-Tomita 答案,我还添加了 .distinct('id') 以排除重复记录:

Party.objects.filter(organizer=user, participants__isnull=False).distinct('id')
Run Code Online (Sandbox Code Playgroud)

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