Fixed #33298 -- Added docs and tests for using Q objects with get_object_or_404()/get_list_or_404().

This commit is contained in:
mgaligniana 2021-11-22 16:30:07 -03:00 committed by Mariusz Felisiak
parent ddf321479b
commit 7f8f69fb38
2 changed files with 28 additions and 4 deletions

View File

@ -157,8 +157,8 @@ will be returned::
but it raises :class:`~django.http.Http404` instead of the model's
:class:`~django.db.models.Model.DoesNotExist` exception.
Required arguments
------------------
Arguments
---------
``klass``
A :class:`~django.db.models.Model` class,
@ -166,6 +166,9 @@ Required arguments
or a :class:`~django.db.models.query.QuerySet` instance from which to get
the object.
``*args``
:class:`Q objects <django.db.models.Q>`.
``**kwargs``
Lookup parameters, which should be in the format accepted by ``get()`` and
``filter()``.
@ -230,14 +233,17 @@ will be raised if more than one object is found.
given model manager cast to a list, raising :class:`~django.http.Http404` if
the resulting list is empty.
Required arguments
------------------
Arguments
---------
``klass``
A :class:`~django.db.models.Model`, :class:`~django.db.models.Manager` or
:class:`~django.db.models.query.QuerySet` instance from which to get the
list.
``*args``
:class:`Q objects <django.db.models.Q>`.
``**kwargs``
Lookup parameters, which should be in the format accepted by ``get()`` and
``filter()``.

View File

@ -1,3 +1,4 @@
from django.db.models import Q
from django.http import Http404
from django.shortcuts import get_list_or_404, get_object_or_404
from django.test import TestCase
@ -75,6 +76,23 @@ class GetObjectOr404Tests(TestCase):
get_list_or_404(Article.objects.all(), title__icontains="Run"),
[article]
)
# Q objects.
self.assertEqual(
get_object_or_404(
Article,
Q(title__startswith='Run') | Q(title__startswith='Walk'),
authors__name__contains='Brave',
),
article,
)
self.assertEqual(
get_list_or_404(
Article,
Q(title__startswith='Run') | Q(title__startswith='Walk'),
authors__name='Patsy',
),
[article],
)
def test_bad_class(self):
# Given an argument klass that is not a Model, Manager, or Queryset