5

私はDjangoにかなり慣れていないので、ListViewのような汎用ビューでモデルを定義することとクエリセットを定義することの違いは何でしょうか。プロジェクトのurls.pyファイルのコード例は次のとおりです。

urlpatterns = patterns('',
    url(r'^$', ListView.as_view(
    model=Person,
    context_object_name='people',
    template_name='index.html', 
    )),
)

私もこれを使用しました:

urlpatterns = patterns('',
    url(r'^$', ListView.as_view(
    queryset=Person.objects.all,
    context_object_name='people',
    template_name='index.html', 
    )),
)

そして、私の見解では同じ結果を受け取りました。クエリセットでできることはいろいろあると思いますか?

4

1 に答える 1

13

使用するmodel=Personqueryset=Person.objects.all、同じ結果を出します。

コードを見てみましょう。AListViewには次の方法があります。

def get_queryset(self):
    """
    Get the list of items for this view. This must be an interable, and may
    be a queryset (in which qs-specific behavior will be enabled).
    """
    if self.queryset is not None:
        queryset = self.queryset
        if hasattr(queryset, '_clone'):
            queryset = queryset._clone()
    elif self.model is not None:
        queryset = self.model._default_manager.all()
    else:
        raise ImproperlyConfigured(u"'%s' must define 'queryset' or 'model'"
                                   % self.__class__.__name__)
    return queryset

ご覧のとおり、最初にを検索し、それself.querysetが存在しない場合はを検索しself.modelます。したがって、リストを指定する方法は2つあります。自分でクエリセットを指定するか、モデルクラスを指定することができます(この場合、Djangoはall()デフォルトのマネージャーのメソッドであるobjects)を呼び出します。

クエリセットでできることはいろいろあると思いますか?

はい。を指定するmodelと、デフォルトですべてのインスタンスを取得します。ただし、を指定するquerysetと、モデルマネージャの他のメソッドを呼び出すこともできます。たとえば、 。Person.objects.children()を持つ人だけを返すことができage <= 12ます。

于 2012-07-08T19:29:38.603 に答える