这是我的模型的简化版本:
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查询最有效地表达这一点?
将相关名称添加到您的模型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_related
和select_related
方法。