我的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)
但是,这将返回所有符合这两个假设的视频:
我应该如何过滤只有状态代码为10的特定格式的人?
谢谢你!答案 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。