Program Club

역 외래 키를 필터링하는 Django Queryset

proclub 2020. 12. 30. 08:20
반응형

역 외래 키를 필터링하는 Django Queryset


다음 Django 모델이 있습니다.

class Make:
   name = models.CharField(max_length=200)

class MakeContent:
   make = models.ForeignKey(Make)
   published = models.BooleanField()

모든 Makes 및 각 관련 MakeContents where 를 포함하는 쿼리 세트를 생성 할 수 있는지 (SQL을 직접 작성하지 않고) 가능한지 알고 싶습니다 published = True.


Django는 select_related()역 외래 키 조회 방법을 지원하지 않으므로 Python을 떠나지 않고 할 수있는 최선은 두 개의 데이터베이스 쿼리입니다. 첫 번째는 where Makes를 포함 MakeContents하는 published = True모든 것을 잡는 것이고 두 번째는 MakeContentswhere를 모두 잡는 것 published = True입니다. 그런 다음 원하는 방식으로 데이터를 반복하고 정렬해야합니다. 이를 수행하는 방법에 대한 좋은 기사가 있습니다.

http://blog.roseman.org.uk/2010/01/11/django-patterns-part-2-efficient-reverse-lookups/


예, 원하는 것 같아요

make = Make.objects.get(pk=1)
make.make_content_set.filter(published=True)

또는 어쩌면

make_ids = MakeContent.objects.filter(published=True).values_list('make_id', flat=True)
makes = Make.objects.filter(id__in=make_ids)

나는 이것이 매우 오래된 질문이라는 것을 알고 있지만 대답하고 있습니다. 내 대답이 다른 사람들을 도울 수 있다고 생각합니다. 다음과 같이 모델을 약간 변경했습니다. Django 1.8을 사용했습니다.

class Make(models.Model):
    name = models.CharField(max_length=200)

class MakeContent(models.Model):
    make = models.ForeignKey(Make, related_name='makecontent')
    published = models.BooleanField()

다음 쿼리 세트를 사용했습니다.

Make.objects.filter(makecontent__published=True)

도움이되기를 바랍니다.


Spike의 답변을 향후 시청자를위한 코드로 번역하겠습니다. 각 'Make'는 0 개에서 여러 개의 'MakeContent'를 가질 수 있습니다.

질문자 가 publish = True 인 적어도 하나의 'MakeContent'로 'Make'를 쿼리하는 것을 의미하는 경우 Jason Christa의 두 번째 스 니펫이 질문에 답합니다.

스 니펫은 다음과 같습니다.

makes = Make.objects.select_related().filter(makecontent__published=True).distinct()

그러나 질문자 가 publish = True 인 모든 'MakeContent'로 'Make'를 쿼리하려는 경우 위의 'makes'에 따라

import operator
make_ids = [m.id for m in makes if 
    reduce(operator.and_, [c.published for c in m.makecontent_set.all()] ) 
]
makes_query = Make.objects.filter(id__in=make_ids)

원하는 쿼리를 포함합니다.

참조 URL : https://stackoverflow.com/questions/5437335/django-queryset-with-filtering-on-reverse-foreign-key

반응형