Django фильтрует модель на счете ManyToMany?
Предположим, что у меня есть что-то вроде этого в моих 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")
Теперь в моем view.py я хотел бы сделать запрос, который будет получать партию для пользователя, где более 0 участников.
Что-то вроде этого может быть:
user = Hipster.get(pk=1)
hip_parties = Party.objects.filter(organiser=user, len(participants) > 0)
Какой лучший способ сделать это?
Ответы
Ответ 1
Если это так, я сделаю это.
Лучший способ может означать много вещей: лучшая производительность, большинство поддерживаемых и т.д. Поэтому я не буду говорить, что это лучший способ, но мне нравится как можно больше придерживаться функций 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))
Ответ 2
Party.objects.filter(organizer=user, participants__isnull=False)
Party.objects.filter(organizer=user, participants=None)
Ответ 3
Легче с exclude
:
# organized by user and has more than 0 participants
Party.objects.filter(organizer=user).exclude(participants=None)
Также возвращает отличные результаты