web-dev-qa-db-ja.com

get_queryset()メソッドを使用するか、queryset変数を設定しますか?

これらの2つのコードは、最初の赤面では同一です。

class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_poll_list'
    queryset = Poll.active.order_by('-pub_date')[:5]

および

class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_poll_list'

    def get_queryset(self):
        return Poll.active.order_by('-pub_date')[:5]

それらの間に違いはありますか?そしてそれが:

どのアプローチが良いですか?または、queryset変数を設定する場合は、get_queryset 方法?およびその逆。

47
9Algorithm

あなたの例では、querysetと_get_queryset_をオーバーライドしても同じ効果があります。 querysetを設定すると、冗長性が低くなるため、少しお勧めします。

querysetを設定すると、サーバーの起動時にクエリセットが1回だけ作成されます。一方、_get_queryset_メソッドはすべてのリクエストに対して呼び出されます。

つまり、クエリを動的に調整する場合は_get_queryset_が便利です。たとえば、現在のユーザーに属するオブジェクトを返すことができます。

_class IndexView(generic.ListView):
    def get_queryset(self):
        """Returns Polls that belong to the current user"""
        return Poll.active.filter(user=self.request.user).order_by('-pub_date')[:5]
_

_get_queryset_が役立つ別の例は、呼び出し可能なものに基づいてフィルタリングしたい場合です。たとえば、今日の投票を返します。

_class IndexView(generic.ListView):
    def get_queryset(self):
        """Returns Polls that were created today"""
        return Poll.active.filter(pub_date=date.today())
_

querysetを設定して同じことを行おうとすると、ビューがロードされたときにdate.today()が1回だけ呼び出され、しばらくするとビューに誤った結果が表示されます。

_class IndexView(generic.ListView):
    # don't do this!
    queryset = Poll.active.filter(pub_date=date.today())
_
65
Alasdair

他の回答では、プロセスの開始時にqueryset属性が評価されるという事実の重要な意味を逃しています。クエリセットを作成するだけではないため、実際にはスライスであり、クエリはその時点で評価済みになります。つまり、その時点では上位5つの投票しか取得できず、プロセスを再開するまで、別の投票を作成しても更新されません。

これは、get_queryset()を使用すべきときです。

8
Daniel Roseman

Queryset属性は内部で使用され、常にメソッドを使用します(多くの場合、リクエストまたはセッション変数に基づいてカスタムクエリを実行する必要があります)

4
rj76

モデルとクエリセットは非常に似ていますが、クエリセットの値が提供された場合、モデルの値はオーバーライドされます。

モデルは、このビューが表示するオブジェクトのタイプです。

Get_querysetをオーバーライドすると、特定のインスタンスこのビューが表示する内容を制御します(例:最後に作成された5つのインスタンス)

Djangoのドキュメントから:

モデル:

このビューがデータを表示するモデル。 model = Fooを指定することは、queryset = Foo.objects.all()を指定することと実質的に同じです。ここで、オブジェクトはFooを表します。デフォルトのマネージャー。

クエリセット:

オブジェクトを表すQuerySet。 指定された場合、クエリセットの値はモデルに指定された値に優先します

get_queryset:

get_queryset()このビューが表示するオブジェクトを取得するために使用されるクエリセットを返します。デフォルトでは、get_queryset()は、設定されている場合はqueryset属性の値を返します。設定されていない場合は、モデル属性のデフォルトマネージャーでall()メソッドを呼び出してQuerySetを構築します。

2
Bar Horing

クラス内に含める

Class MyViewSet(GenericAPIView):

    queryset = ''

クエリセットをどこでも使用しない場合。

これは私のために働いた。

ありがとう

0
Shinto Joseph