2011-03-30 54 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.