2016-04-23 3 views
0

私はいつもdjangoでget_queryset()が冗長かどうか疑問に思っています。私たちが知っているように、get_queryset()はオブジェクトのリストをページに返しますが、このオブジェクトのリストを返すために、get_context_data()でいつでも指定することができ、get_context_data()はリスト。次のように例を見ることができます。get_context_data()があるので、django get_queryset()は冗長ですか?

戻りget_querysetによって子どもの本のリスト()

from django.views.generic import ListView 
from books.models import Book 

class ChildrenBook(ListView): 
    model = Book 
    def get_queryset(self, *args, **kwargs): 
     qset = super(BookListView, self).get_queryset(*args, **kwargs) 
     return qset.filter(type="children") 

戻りget_context_dataによって子どもの本(のリスト)

from django.views.generic import ListView 
from books.models import Book 

class ChildrenBook(ListView): 
    model = Book 
    def get_context_data(self, **kwargs): 
     context = super(PublisherDetail, self).get_context_data(**kwargs) 
     context['children_book_list'] = Book.objects.filter(type="children") 
     return context 

私の知る限りでは、get_queryset()ができることは何も見つかりませんが、 get_context_dataできません。誰でもget_queryset()のみを使用してその必要性を説明できる状況を見つけることができますか?

答えて

0

あなたは、実際のDjangoのソースコードを見ている場合は、コードの全体の束を書き換えるために持っている場合を除きだけget_context_dataをオーバーロードすることは悪い考えですなぜあなたが表示されます:基本的に

class BaseListView(MultipleObjectMixin, View): 
    """ 
    A base view for displaying a list of objects. 
    """ 
    def get(self, request, *args, **kwargs): 
     self.object_list = self.get_queryset() 
     allow_empty = self.get_allow_empty() 

     if not allow_empty: 
      # When pagination is enabled and object_list is a queryset, 
      # it's better to do a cheap query than to load the unpaginated 
      # queryset in memory. 
      if (self.get_paginate_by(self.object_list) is not None 
        and hasattr(self.object_list, 'exists')): 
       is_empty = not self.object_list.exists() 
      else: 
       is_empty = len(self.object_list) == 0 
      if is_empty: 
       raise Http404(_("Empty list and '%(class_name)s.allow_empty' is False.") 
         % {'class_name': self.__class__.__name__}) 
     context = self.get_context_data() 
     return self.render_to_response(context) 

、ありませんget_querysetメソッドをオーバーロードすると、object_listプロパティが正しく設定されないため、フィルタにレコードが存在しない場合のようなケースは処理されません。

+0

私は、get_queryset()とget_context_data()のオーバーロードの必要性については言及していません。最初の質問では、get_queryset()とget_context_data()の両方がフロントエンドにデータを送信するということです。フロントエンドにすべてのデータを送信する方法としては、2番目の方法がなくても十分です。 –

+0

私はあなたがリクエスト/応答サイクルを誤解していると思うかもしれません** ** 'get_queryset()'や 'get_context_data()'もフロントエンドにデータを送りません。貼り付けられたコードからわかるように、ユーザにデータを送る関数は、 'render_to_response'を呼び出すので' get() 'です。これらの方法の両方は、異なる点で途中で呼び出されます。そして、それぞれは違うことをします。 OPでのあなたの質問は: 'get_queryset()がdjangoで重複している場合です。 '上記の基本djangoコードで分かるように、そうではありません。 – 2ps

関連する問題