gpt4 book ai didi

python - 为什么这是进行两次查询而不是一次?

转载 作者:太空宇宙 更新时间:2023-11-03 18:57:19 24 4
gpt4 key购买 nike

查看:

transfer_details = TransferDetail.objects.filter(user=request.user).select_related('transfermethod_set')

print transfer_details.filter(method__name='PayPal')

型号:

class TransferMethod(models.Model):
name = models.CharField(max_length=30)
...


class TransferDetail(models.Model):
data = models.TextField()
...
method = models.ForeignKey(TransferMethod)
user = models.ForeignKey(User)

我希望使用第一行中的transfer_details QuerySet,而无需进一步的数据库调用。

我缺少什么?

更新1

所以我发现当我有这两行时,没有其他查询:

    x = transfer_details.filter(method__name='PayPal')
x2 = transfer_details.filter(method__name='Something')

但是当我添加以下两行时,它会进行 2 个数据库查询:

    list(x[:1])
list(x2[:1])

幕后发生了什么以及如何避免额外的调用?

更新2

我尝试过:

transfer_details.get(method__name='PayPal').data
...

它还进行两个查询。

最佳答案

正确应该是(假设您还想在一个查询中获取用户数据):

transfer_details = TransferDetail.objects.filter(
user=request.user).select_related('method', 'user')

您不需要选择method,因为当您在printtransfer_details.filter(method__name='PayPal')中过滤它时,它应该会被自动选择。当您调用 print 时,TansferDetail__unicode__ 将被调用,因此额外的原因可能是您在那里输出一些其他相关数据(例如,来自User模型,应该用上面的代码来解决......)。

要回答您编辑的问题:如果您在查询集上调用 list ,则查询集将获取 evaluated ,这意味着进行了实际的查询。

不知道您是否在代码之前的某个时刻访问了 request.user ,但如果情况并非如此,则第二个查询可能是获取用户的结果当前请求。

关于python - 为什么这是进行两次查询而不是一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16994547/

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