Django过滤多个到多个字段

问题描述 投票:0回答:1

这是我的模型的简化版本:

class User(models.Model):
    pass

class Foo(models.Model):
    owners = models.ManyToManyField(User)
    bar = models.ForeignKey(Bar)

class Bar(models.Mode)
    pass

我有一个用户实例,我想为与该用户关联的所有Bar实例计算一个查询集。从用户到Bar,包括获取所有具有用户所有者的Foo对象,然后获取与每个Foo相关联的所有bar实例。

如何使用django查询最有效地表达这一点?

django
1个回答
1
投票

将相关名称添加到您的模型Foo。这将有助于编写查询。

class Foo(models.Model):
    owners = models.ManyToManyField('User', related_name='foo')
    bar = models.ForeignKey('Bar', related_name='foo')

现在假设您有一个如上所述的用户实例,您可以进行如下查询:

user = User.objects.get(pk=1)
qs = Bar.objects.filter(foo__owners=user)

如果你最有效的意思是性能而不是表达式,那么你应该看一下QuerySet的prefetch_relatedselect_related方法。

© www.soinside.com 2019 - 2024. All rights reserved.