queryset - onetomany django model
Django filtra el modelo en el recuento ManyToMany? (4)
Derivado de @ Yuji-''Tomita''-Tomita answer, también he agregado .distinct (''id'') para excluir los registros de duplitate:
Party.objects.filter(organizer=user, participants__isnull=False).distinct(''id'')
Por lo tanto, cada parte se enumera solo una vez.
Supongamos que tengo algo como esto en mi 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")
Ahora en mi views.py me gustaría hacer una consulta que buscaría una fiesta para el usuario donde hay más de 0 participantes.
Algo como esto tal vez:
user = Hipster.get(pk=1)
hip_parties = Party.objects.filter(organiser=user, len(participants) > 0)
¿Cuál es la mejor manera de hacerlo?
Más fácil con exclude
:
# organized by user and has more than 0 participants
Party.objects.filter(organizer=user).exclude(participants=None)
También devuelve resultados distintos
Si esto funciona, así es como lo haría.
La mejor manera puede significar muchas cosas: el mejor rendimiento, la mayor facilidad de mantenimiento, etc. Por lo tanto, no diré que es la mejor manera, pero me gusta mantener las características de ORM tanto como sea posible, ya que parece más fácil de mantener.
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))
Party.objects.filter(organizer=user, participants__isnull=False)
Party.objects.filter(organizer=user, participants=None)