-
-
Notifications
You must be signed in to change notification settings - Fork 31.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fixed #2756 -- Modified the get_object_or_404/get_list_or_404 shortcu…
…ts 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
- Loading branch information
1 parent
c3f8912
commit e1c6e98
Showing
5 changed files
with
139 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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") | ||
<Article: Run away!> | ||
# We can also use the the Article manager through an Author object. | ||
>>> get_object_or_404(a.article_set, title__contains="Run") | ||
<Article: Run away!> | ||
# 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!") | ||
<Article: Run away!> | ||
# get_list_or_404 can be used to get lists of objects | ||
>>> get_list_or_404(a.article_set, title__icontains='Run') | ||
[<Article: Run away!>] | ||
# 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") | ||
[<Article: Run away!>] | ||
"""} |