2011-03-30 82 views
8

我在我的Django項目以下型號:Django的通過多個字段篩選的許多一對多中介表

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是格式):

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

我很想使用:

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

不過,這將返回同時匹配這些假設所有視頻:

  • a)包含該特定格式,並且
  • b)包含具有狀態10的任何格式

我該如何篩選那些在狀態碼10中具有特定格式的人?

謝謝!

+0

僅供參考如果您想要或兩個查詢集,我相信您在查詢集之間使用'|'。不知道這對OP有多大幫助,但它應該有助於其他人來到這裏。 – Pureferret 2015-02-03 14:14:06

回答

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 2013-06-06 01:30:42

+0

實際上它與OP建議不同,請查看https://docs.djangoproject.com/ en/1.10/topics/db/queries /#spanning-multi-valued -interest關係供您參考 – klis87 2016-09-14 16:59:54

10

現在,我要篩選具有特定格式的所有視頻,併爲格式 狀態碼爲10(可以使用)。我怎樣才能做到這一點? (假設f是格式)

你貼會做你想要什麼代碼:

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

這是記錄在the filter() documentation

多個參數是通過加入並在底層的SQL 聲明中。

2

可能與OP不相關,但可能是像我這樣的人在搜索正確答案時發現此線程。

Ludwik說得對,但文檔中解釋所有這些以及如何去除的部分位於queries documentation

請注意,將過濾器拆分爲兩個filter調用(如Chris所建議的)將會帶來完全相反的結果:它將搜索具有媒體格式f的視頻,該媒體格式不一定是相同的媒體格式,狀態爲10.