Merge pull request #1460 from loic/ObjectMixins.get_queryset
Improved queryset handling and docs for (Single|Multiple)ObjectMixin.
This commit is contained in:
commit
4fa2738ff3
|
@ -57,19 +57,23 @@ class SingleObjectMixin(ContextMixin):
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
"""
|
"""
|
||||||
Get the queryset to look an object up against. May not be called if
|
Return the `QuerySet` that will be used to look up the object.
|
||||||
`get_object` is overridden.
|
|
||||||
|
Note that this method is called by the default implementation of
|
||||||
|
`get_object` and may not be called if `get_object` is overriden.
|
||||||
"""
|
"""
|
||||||
if self.queryset is None:
|
if self.queryset is None:
|
||||||
if self.model:
|
if self.model:
|
||||||
return self.model._default_manager.all()
|
return self.model._default_manager.all()
|
||||||
else:
|
else:
|
||||||
raise ImproperlyConfigured("%(cls)s is missing a queryset. Define "
|
raise ImproperlyConfigured(
|
||||||
"%(cls)s.model, %(cls)s.queryset, or override "
|
"%(cls)s is missing a QuerySet. Define "
|
||||||
"%(cls)s.get_queryset()." % {
|
"%(cls)s.model, %(cls)s.queryset, or override "
|
||||||
'cls': self.__class__.__name__
|
"%(cls)s.get_queryset()." % {
|
||||||
})
|
'cls': self.__class__.__name__
|
||||||
return self.queryset._clone()
|
}
|
||||||
|
)
|
||||||
|
return self.queryset.all()
|
||||||
|
|
||||||
def get_slug_field(self):
|
def get_slug_field(self):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -2,6 +2,7 @@ from __future__ import unicode_literals
|
||||||
|
|
||||||
from django.core.paginator import Paginator, InvalidPage
|
from django.core.paginator import Paginator, InvalidPage
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
|
from django.db.models.query import QuerySet
|
||||||
from django.http import Http404
|
from django.http import Http404
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from django.views.generic.base import TemplateResponseMixin, ContextMixin, View
|
from django.views.generic.base import TemplateResponseMixin, ContextMixin, View
|
||||||
|
@ -22,18 +23,25 @@ class MultipleObjectMixin(ContextMixin):
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
"""
|
"""
|
||||||
Get the list of items for this view. This must be an iterable, and may
|
Return the list of items for this view.
|
||||||
be a queryset (in which qs-specific behavior will be enabled).
|
|
||||||
|
The return value must be an iterable and may be an instance of
|
||||||
|
`QuerySet` in which case `QuerySet` specific behavior will be enabled.
|
||||||
"""
|
"""
|
||||||
if self.queryset is not None:
|
if self.queryset is not None:
|
||||||
queryset = self.queryset
|
queryset = self.queryset
|
||||||
if hasattr(queryset, '_clone'):
|
if isinstance(queryset, QuerySet):
|
||||||
queryset = queryset._clone()
|
queryset = queryset.all()
|
||||||
elif self.model is not None:
|
elif self.model is not None:
|
||||||
queryset = self.model._default_manager.all()
|
queryset = self.model._default_manager.all()
|
||||||
else:
|
else:
|
||||||
raise ImproperlyConfigured("'%s' must define 'queryset' or 'model'"
|
raise ImproperlyConfigured(
|
||||||
% self.__class__.__name__)
|
"%(cls)s is missing a QuerySet. Define "
|
||||||
|
"%(cls)s.model, %(cls)s.queryset, or override "
|
||||||
|
"%(cls)s.get_queryset()." % {
|
||||||
|
'cls': self.__class__.__name__
|
||||||
|
}
|
||||||
|
)
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
def paginate_queryset(self, queryset, page_size):
|
def paginate_queryset(self, queryset, page_size):
|
||||||
|
|
|
@ -63,6 +63,14 @@ MultipleObjectMixin
|
||||||
A ``QuerySet`` that represents the objects. If provided, the value of
|
A ``QuerySet`` that represents the objects. If provided, the value of
|
||||||
``queryset`` supersedes the value provided for :attr:`model`.
|
``queryset`` supersedes the value provided for :attr:`model`.
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
|
||||||
|
``queryset`` is a class attribute with a *mutable* value so care
|
||||||
|
must be taken when using it directly. Before using it, either call
|
||||||
|
its :meth:`~django.db.models.query.QuerySet.all` method or
|
||||||
|
retrieve it with :meth:`get_queryset` which takes care of the
|
||||||
|
cloning behind the scenes.
|
||||||
|
|
||||||
.. attribute:: paginate_by
|
.. attribute:: paginate_by
|
||||||
|
|
||||||
An integer specifying how many objects should be displayed per page. If
|
An integer specifying how many objects should be displayed per page. If
|
||||||
|
|
|
@ -23,6 +23,14 @@ SingleObjectMixin
|
||||||
A ``QuerySet`` that represents the objects. If provided, the value of
|
A ``QuerySet`` that represents the objects. If provided, the value of
|
||||||
``queryset`` supersedes the value provided for :attr:`model`.
|
``queryset`` supersedes the value provided for :attr:`model`.
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
|
||||||
|
``queryset`` is a class attribute with a *mutable* value so care
|
||||||
|
must be taken when using it directly. Before using it, either call
|
||||||
|
its :meth:`~django.db.models.query.QuerySet.all` method or
|
||||||
|
retrieve it with :meth:`get_queryset` which takes care of the
|
||||||
|
cloning behind the scenes.
|
||||||
|
|
||||||
.. attribute:: slug_field
|
.. attribute:: slug_field
|
||||||
|
|
||||||
The name of the field on the model that contains the slug. By default,
|
The name of the field on the model that contains the slug. By default,
|
||||||
|
|
Loading…
Reference in New Issue