Programing

Django는 ManyToMany 카운트에서 모델을 필터링합니까?

crosscheck 2020. 11. 30. 07:51
반응형

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")

이제 내 views.py에서 참가자가 0 명 이상인 사용자를 위해 파티를 가져 오는 쿼리를 수행하고 싶습니다.

아마도 다음과 같습니다.

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

가장 좋은 방법은 무엇입니까?


이것이 작동한다면 이것이 내가 할 방법입니다.

최선의 방법은 최고의 성능, 가장 유지 보수 가능한 등 많은 것을 의미 할 수 있습니다. 따라서 이것이 최선의 방법이라고 말하지는 않겠지 만, 유지 보수가 더 쉬워 보이기 때문에 가능한 한 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))

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

더 쉽게 exclude:

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

고유 한 결과도 반환합니다.


@ Yuji-'Tomita'-Tomita 답변에서 파생 된 중복 레코드를 제외하기 위해 .distinct ( 'id')도 추가했습니다.

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

따라서 각 당사자는 한 번만 나열됩니다.

참고 URL : https://stackoverflow.com/questions/7883916/django-filter-the-model-on-manytomany-count

반응형