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

use*_*334 13 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)
Run Code Online (Sandbox Code Playgroud)

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

f = Format.objects.get(pk=3)
Run Code Online (Sandbox Code Playgroud)

我很想用:

Video.objects.filter(media__formats=f, media__mediaformat__status=10)
Run Code Online (Sandbox Code Playgroud)

但是,这将返回所有符合这两个假设的视频:

  • a)包含该特定格式,以及
  • b)包含状态为10的任何格式

我该如何过滤只有状态代码为10的那种特定格式的人?

谢谢!

Lud*_*mer 13

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

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

Video.objects.filter(media__formats=f, media__mediaformat__status=10)
Run Code Online (Sandbox Code Playgroud)

这在文档中filter()记录:

多个参数通过基础SQL语句中的AND连接.


Chr*_* W. 9

您可以将过滤器链接在一起以形成"AND"构造.

格式为的格式f和格式的状态10

Video.objects.filter(media__formats=f).filter(media__mediaformat__status=10)
Run Code Online (Sandbox Code Playgroud)

  • 不确定这与OP的建议有何不同:Video.objects.filter(media__formats = f,media__mediaformat__status = 10) (2认同)