查看:
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
...
它也在进行两次查询。
答案 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>