2011-03-30 4 views
8

나는 내 장고 프로젝트의 다음 모델이 있습니다장고 대다 중간 테이블에 여러 필드를 필터링

class Video(models.Model): 
    media = models.ForeignKey(Media) 

class Media(models.Model): 
    title = models.CharField(max_length=255) 
    formats = models.ManyToManyField(Format,through='MediaFormat',related_name='media',blank=True) 

class Format(models.Model): 
    title = models.CharField(max_length=50) 

class MediaFormat(models.Model): 
    status = models.IntegerField() 
    format = models.ForeignKey(Format) 
    media = models.ForeignKey(Media) 

지금, 나는 특정 형식이있는 모든 비디오를 필터링 할, 그리고 해당 형식의 상태 코드는 10 (사용할 준비가되었습니다)입니다. 어떻게해야합니까? (즉, F를 가정하면 형식) : 다음

Video.objects.filter(media__formats=f, media__mediaformat__status=10) 

그러나, 이러한 가정 모두 일치하는 모든 동영상을 반환하는 :

    f = Format.objects.get(pk=3) 
    

    내가 사용하는 유혹 해요

  • a) 특정 형식을 포함하고
  • b) 상태가 1
  • 인 모든 형식을 포함해야합니다.

상태 코드가 10 인 특정 형식의 사용자 만 필터링하려면 어떻게해야합니까?

감사합니다.

+0

참고 두 개의 쿼리 집합을 원한다면 쿼리 집합간에'| '를 사용하는 것이 좋습니다. 이것이 OP에 얼마나 도움이되는지 확실하지 않지만 여기에 오는 다른 사람들에게 도움이 될 것입니다. – Pureferret

답변

8

"AND"구성을 위해 필터를 함께 연결할 수 있습니다. (형식은 f 및 형식의 상태입니다

비디오는 내가 특정 형식이있는 모든 비디오를 필터링 할 지금 10

Video.objects.filter(media__formats=f).filter(media__mediaformat__status=10) 
+2

OP의 제안과 다른 점은 확실하지 않습니다. Video.objects.filter (media__formats = f, media__mediaformat__status = 10) – jarmod

+0

실제로 OP와 다른 점이 있으니 https://docs.djangoproject.com/를 참조하십시오. en/1.10/topics/db/queries/# 참조 용 스패닝 - 복수 값 관계 – klis87

10

이며, 그 형식에 대한 상태 코드는 10입니다 사용할 준비가). 어떻게해야합니까?

Video.objects.filter(media__formats=f, media__mediaformat__status=10) 

the filter() documentation에 설명되어 있습니다 :

여러 매개 변수를 통해 연결된다

당신은 당신이 원하는 것을 정확히 할 것입니다 게시 한 코드 (즉, F를 가정하는 형식입니다) 기본 SQL 문에 있습니다.

2

아마도 OP와 관련이 없지만 정답을 검색하는 동안이 스레드를 찾은 나와 같은 다른 사람들이있을 수 있습니다.

루드 윅은 올바르게 이해하고 있지만이 모든 것을 설명하는 문서의 섹션과 제외 방법은 queries documentation입니다.

Chris와 같은 두 개의 filter 호출로 필터를 분할하면 정확히 반대되는 결과를 얻을 수 있습니다. 미디어 형식이 f이고 반드시 동일한 미디어 형식이 아닌 비디오 형식의 비디오를 검색합니다.

관련 문제