gpt4 book ai didi

Django 避免使用 prefetch_related 的额外查询不起作用

转载 作者:行者123 更新时间:2023-12-04 19:02:48 25 4
gpt4 key购买 nike

我以前使用过 select_relatedprefetch_related,效果很好。

我正在处理一个当前项目,由于某种原因,我无法弄清楚为什么我的预取相关查询无法正常工作,因此我收到了很多冗余的数据库调用。

我的模型:

class User(models.Model):
user_extra_info = models.ManyToManyField(
AppGeneralData,
through='UserExtraInfo',
null=True,
blank=True
)

class AppGeneralData(models.Model):
title = models.CharField(max_length=255)
type = models.PositiveSmallIntegerField(
choices=GENERAL_DATA_TYPE
)

class UserExtraInfo(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL)
info_item = models.ForeignKey(AppGeneralData)

查询集:

User.objects.all().prefetch_related(
Prefetch(
'userextrainfo_set',
queryset=UserExtraInfo.objects.select_related('info_item').all()
)
)

问题:

当遍历查询集并调用子查询时,它不会从缓存的查询集中获取它:

for user in qs:
user.userextrainfo_set.filter(
info_item__type=general_data_type
).values_list(
'info_item__title', flat=True
))

每次调用时子查询都会转到数据库,我不明白我缺少什么。

谢谢。

最佳答案

当你调用 filter() 时,这会创建一个不同的查询集,因此 Django 不能使用来自 prefetch_related 的数据。

您可以将过滤器移动到 Prefetch 对象的查询集中。

qs = User.objects.all().prefetch_related(
Prefetch('userextrainfo_set', queryset=UserExtraInfo.objects.filter(
info_item__type=general_data_type
).select_related('info_item'), to_attr='general_userextrainfo')
)

那么在访问查询集中的相关项时不要使用filter()

for user in qs:
user.general_userextrainfo.values_list('info_item__title', flat=True))

关于Django 避免使用 prefetch_related 的额外查询不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33551200/

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