【问题标题】:Django - queryset vs model in Generic ViewDjango - 通用视图中的查询集与模型
【发布时间】:2012-07-08 07:34:45
【问题描述】:

我是 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', 
    )),
)

在我看来也得到了同样的结果。我假设您可以使用查询集做不同的事情?

【问题讨论】:

    标签: python django django-views django-queryset django-generic-views


    【解决方案1】:

    使用model=Personqueryset=Person.objects.all 会得到相同的结果。

    让我们看一下代码。 ListView 有如下方法:

    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。所以指定列表有两种可能:你可以自己提供一个查询集,或者你可以指定一个模型类(在这种情况下,Django 将调用默认管理器的all() 方法,即objects)。

    我假设您可以使用查询集做不同的事情?

    是的。如果您指定 model,则默认情况下您将获得所有实例。但是如果你指定queryset,你也可以调用模型管理器的其他方法,比如Person.objects.children(),它只能返回age <= 12的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 2017-10-18
      • 2022-01-02
      • 2019-08-27
      相关资源
      最近更新 更多