为什么这是两个查询而不是一个?

时间:2013-06-07 23:53:33

标签: python django

查看:

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个DB查询:

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

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

更新2

我试过了:

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

它也在进行两次查询。

1 个答案:

答案 0 :(得分:1)

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

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

您不需要选择method,因为当您在print transfer_details.filter(method__name='PayPal')中对其进行过滤时,应自动选择它。当您致电print TansferDetail时,__unicode__将被调用,因此附加原因可能是您在那里输出了一些其他相关数据(例如来自User }模型,应该用上面的代码来解决......)。

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

在您的代码之前的某个时刻不知道您是否正在访问request.user,但如果不是这样,则第二个查询可能是获取当前请求的用户的结果。< / p>