From e1c6e987d07efb3ee9471e63541f9561b461ea44 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Wed, 3 Jan 2007 14:16:58 +0000 Subject: Fixed #2756 -- Modified the get_object_or_404/get_list_or_404 shortcuts to accept model managers as well as model classes. Thanks, Gary Wilson. git-svn-id: http://code.djangoproject.com/svn/django/trunk@4275 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- tests/modeltests/get_object_or_404/__init__.py | 0 tests/modeltests/get_object_or_404/models.py | 86 ++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 tests/modeltests/get_object_or_404/__init__.py create mode 100644 tests/modeltests/get_object_or_404/models.py (limited to 'tests') diff --git a/tests/modeltests/get_object_or_404/__init__.py b/tests/modeltests/get_object_or_404/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/modeltests/get_object_or_404/models.py b/tests/modeltests/get_object_or_404/models.py new file mode 100644 index 0000000000..79bcc6f52c --- /dev/null +++ b/tests/modeltests/get_object_or_404/models.py @@ -0,0 +1,86 @@ +""" +34. DB-API Shortcuts + +get_object_or_404 is a shortcut function to be used in view functions for +performing a get() lookup and raising a Http404 exception if a DoesNotExist +exception was rasied during the get() call. + +get_list_or_404 is a shortcut function to be used in view functions for +performing a filter() lookup and raising a Http404 exception if a DoesNotExist +exception was rasied during the filter() call. +""" + +from django.db import models +from django.http import Http404 +from django.shortcuts import get_object_or_404, get_list_or_404 + +class Author(models.Model): + name = models.CharField(maxlength=50) + + def __str__(self): + return self.name + +class ArticleManager(models.Manager): + def get_query_set(self): + return super(ArticleManager, self).get_query_set().filter(authors__name__icontains='sir') + +class Article(models.Model): + authors = models.ManyToManyField(Author) + title = models.CharField(maxlength=50) + objects = models.Manager() + by_a_sir = ArticleManager() + + def __str__(self): + return self.title + +__test__ = {'API_TESTS':""" +# Create some Authors. +>>> a = Author.objects.create(name="Brave Sir Robin") +>>> a.save() +>>> a2 = Author.objects.create(name="Patsy") +>>> a2.save() + +# No Articles yet, so we should get a Http404 error. +>>> get_object_or_404(Article, title="Foo") +Traceback (most recent call last): +... +Http404 + +# Create an Article. +>>> article = Article.objects.create(title="Run away!") +>>> article.authors = [a, a2] +>>> article.save() + +# get_object_or_404 can be passed a Model to query. +>>> get_object_or_404(Article, title__contains="Run") + + +# We can also use the the Article manager through an Author object. +>>> get_object_or_404(a.article_set, title__contains="Run") + + +# No articles containing "Camelot". This should raise a Http404 error. +>>> get_object_or_404(a.article_set, title__contains="Camelot") +Traceback (most recent call last): +... +Http404 + +# Custom managers can be used too. +>>> get_object_or_404(Article.by_a_sir, title="Run away!") + + +# get_list_or_404 can be used to get lists of objects +>>> get_list_or_404(a.article_set, title__icontains='Run') +[] + +# Http404 is returned if the list is empty +>>> get_list_or_404(a.article_set, title__icontains='Shrubbery') +Traceback (most recent call last): +... +Http404 + +# Custom managers can be used too. +>>> get_list_or_404(Article.by_a_sir, title__icontains="Run") +[] + +"""} -- cgit v1.3