gpt4 book ai didi

django - select_related 与反向外键

转载 作者:行者123 更新时间:2023-11-28 19:35:54 32 4
gpt4 key购买 nike

我在 Django 中有两个模型。第一个是什么工作职能(职位)向哪些其他职位报告的层次结构,第二个是人员及其担任的工作职能。

class PositionHierarchy(model.Model):
pcn = models.CharField(max_length=50)
title = models.CharField(max_length=100)
level = models.CharField(max_length=25)
report_to = models.ForeignKey('PositionHierachy', null=True)


class Person(model.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
...
position = models.ForeignKey(PositionHierarchy)

当我有一个 Person 记录并且我想找到这个人的经理时,我必须做

manager = person.position.report_to.person_set.all()[0]
# Can't use .first() because we haven't upgraded to 1.6 yet

如果我让人们使用 QuerySet,我可以使用 Person.objects.select_related('position' , 'position__reports_to').filter(...),但是有什么方法可以避免再次访问数据库以获取 person_set?我尝试将 'position__reports_to__person_set' 或只是 position__reports_to__person 添加到 select_related,但这似乎并没有改变查询。这是 prefetch_related 的用途吗?

我想创建一个自定义管理器,这样当我进行查询以获取人员记录时,我还可以获得他们的 PositionHeirarchy 和他们的经理的人员记录,而无需更多往返数据库。这是我目前所拥有的:

class PersonWithManagerManager(models.Manager):
def get_query_set(self):
qs = super(PersonWithManagerManager, self).get_query_set()
return qs.select_related(
'position',
'position__reports_to',
).prefetch_related(
)

最佳答案

是的,这就是 prefetch_related() 的用途。它将需要一个额外的查询,但其想法是它会立即获取所有相关信息,而不是每个 Person 一次。

在你的情况下:

qs.select_related('position__report_to')
.prefetch_related('position__report_to__person_set')

无论原始查询集中有多少 Persons,都应该需要两次查询。

比较 documentation 中的这个例子:

>>> Restaurant.objects.select_related('best_pizza')
.prefetch_related('best_pizza__toppings')

关于django - select_related 与反向外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23121850/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com