1

意見:

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)

データベースをさらに呼び出すことなく、1 行目の transfer_details QuerySet が使用されることを期待しています。

私は何が欠けていますか?

更新 1

したがって、これらの 2 つの行があるときに、追加のクエリがないことがわかりました。

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

しかし、次の 2 行を追加すると、2 つの DB クエリが作成されます。

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

内部で何が起こっているのか、余分な呼び出しを避けるにはどうすればよいですか?

更新 2

私は試した:

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

また、2 つのクエリを作成しています。

4

1 に答える 1

1

正しくは次のようになります (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と、クエリセットが評価されます。これは、実際のクエリが作成されることを意味します。

コードの前のある時点でアクセスrequest.userしているかどうかはわかりませんが、そうでない場合は、2 番目のクエリが現在のリクエストのユーザーを取得した結果である可能性があります。

于 2013-06-08T00:03:58.523 に答える