python 如何在Django ManyToManyField上应用过滤器,以便字段的多个值遵循条件?

fjaof16o  于 2023-03-11  发布在  Python
关注(0)|答案(3)|浏览(128)
class Publication(models.Model):
    title = models.CharField(max_length=30)

class Article(models.Model):
    headline = models.CharField(max_length=100)
    publications = models.ManyToManyField(Publication)

p1 = Publication.objects.create(title='The Python Journal')
p2 = Publication.objects.create(title='Science News')
p3 = Publication.objects.create(title='Science Weekly')

我想过滤在p1p3上发布的文章。它们可能会也可能不会在其他发布物上发布,但它们必须在p1p3上发布。
我试过:

Article.objects.filter(Q(publications=p1) & Q(publications=p3))

但它返回空查询集,这不是真

wgmfuz8q

wgmfuz8q1#

我遇到过类似的问题,有些用户在结束时有一个免费角色,也有一个付费角色,所以我需要选择在多对多字段中有两个特定角色的用户。
我做了这样的事情,像一个魅力

roles = [premium_role, default_role]

DiscordUser.objects.filter(guild=guild)
    .annotate(freemium=Count('roles', filter=Q(roles__in=roles)))
    .filter(freemium=2)
    .values('id')
h79rfbju

h79rfbju2#

如果您将多个调用链接到filter(),它们的行为应该类似于与AND连接:

articles = Article.objects.filter(publications=p1).filter(publications=p3).distinct()
7kjnsjlb

7kjnsjlb3#

在多对多和多对一测试中有许多FOO__in=...样式筛选器的示例。以下是针对您的特定问题的语法:

# filtering on a few publications, by id
articles = Article.objects.filter(publications__in=[<id1>, <id2>, <id3>])
# and by publication object (object gets converted to pk under the covers)
articles = Article.objects.filter(publications__in=[publication1, publication2, publication3])
# and by publication title
articles = Article.objects.filter(publications__title__icontains='Science')

icontains用于i表示不区分大小写,contains表示单词包含这些字母,可能有更少或更多的字母。
在使用queryset时,到处都使用双下划线(__)语法。

相关问题