Django过滤多对多中间表中的多个字段

时间:2011-03-30 17:06:48

标签: django many-to-many django-orm

我的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的特定格式的人?

谢谢你!

3 个答案:

答案 0 :(得分:12)

  

现在,我想过滤所有具有特定格式的视频,并且   该格式的状态代码是10(可以使用)。我怎样才能做到这一点?   (假设f是格式)

您发布的代码将完全符合您的要求:

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

the filter() documentation中记录了这一点:

  

在底层SQL中通过AND连接多个参数   言。

答案 1 :(得分:9)

您可以将过滤器链接在一起以形成“AND”构造。

格式为f且格式状态为10

的视频
Video.objects.filter(media__formats=f).filter(media__mediaformat__status=10)

答案 2 :(得分:2)

可能与OP无关,但可能是像我这样在寻找正确答案时找到此主题的其他人。

Ludwik说得对,但文档中解释所有这些以及如何排除的部分都在queries documentation

请注意,将过滤器拆分为两个{Chris}建议的filter调用会产生完全相反的结果:它会搜索具有媒体格式f且具有媒体格式的视频,不一定是相同的媒体格式,状态为10。