Python 为什么这是两个问题而不是一个问题?
视图: 型号:Python 为什么这是两个问题而不是一个问题?,python,django,Python,Django,视图: 型号: transfer_details = TransferDetail.objects.filter(user=request.user).select_related('transfermethod_set') print transfer_details.filter(method__name='PayPal') 我希望第一行的transfer_details QuerySet可以在没有进一步数据库调用的情况下使用 我错过了什么 更新1 因此,我发现当我有这两行时,没有其他查
transfer_details = TransferDetail.objects.filter(user=request.user).select_related('transfermethod_set')
print transfer_details.filter(method__name='PayPal')
我希望第一行的transfer_details QuerySet可以在没有进一步数据库调用的情况下使用
我错过了什么
更新1
因此,我发现当我有这两行时,没有其他查询:
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)
但当我添加以下两行时,它会进行2 DB的查询:
x = transfer_details.filter(method__name='PayPal')
x2 = transfer_details.filter(method__name='Something')
引擎盖下发生了什么?我如何避免额外的呼叫
更新2
我试过:
list(x[:1])
list(x2[:1])
它还进行了两次查询。应该是正确的(假设您还希望在一次查询中获取用户数据):
您不需要选择method
,因为当您在print transfer\u details.filter(method\u name='PayPal')
中对其进行筛选时,应该会自动选择它。当您调用print
TansferDetail
时,将调用\uuuuUnicode\uuuuuu
,因此额外的原因可能是您正在那里输出一些其他相关数据(例如,来自用户
模型,这应该用上面的代码解决…)
回答编辑后的问题:如果在查询集上调用list
,则查询集将获得,这意味着实际查询已完成
不知道您是否正在访问代码中以前的某个点上的请求。user
,但如果不是这样,则第二个查询可能是获取当前请求的用户的结果。应该是正确的(假设您还希望在一个查询中获取用户数据):
您不需要选择method
,因为当您在print transfer\u details.filter(method\u name='PayPal')
中对其进行筛选时,应该会自动选择它。当您调用print
TansferDetail
时,将调用\uuuuUnicode\uuuuuu
,因此额外的原因可能是您正在那里输出一些其他相关数据(例如,来自用户
模型,这应该用上面的代码解决…)
回答编辑后的问题:如果在查询集上调用list
,则查询集将获得,这意味着实际查询已完成
不知道您是否在代码之前的某个时间访问了请求.user
,但如果不是这样,则第二个查询可能是获取当前请求的用户的结果
transfer_details.get(method__name='PayPal').data
...
transfer_details = TransferDetail.objects.filter(
user=request.user).select_related('method', 'user')