역 외래 키를 필터링하는 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
'Program Club' 카테고리의 다른 글
| Scala에서 여러 생성자가있는 Java 클래스를 어떻게 하위 클래스로 만들 수 있습니까? (0) | 2020.12.30 |
|---|---|
| Git을 사용하여 자동 병합을 방지하려면 어떻게해야합니까? (0) | 2020.12.30 |
| 반환과 동일하게 false를 반환합니까? (0) | 2020.12.30 |
| Spring MVC에서 BindingResult 인터페이스의 사용은 무엇입니까? (0) | 2020.12.30 |
| Jquery Autocomplete 필드에 추가 매개 변수를 어떻게 전달합니까? (0) | 2020.12.29 |