Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

Fixed #3121 -- Made `get_or_create()` work for `RelatedManager` and `…

…ManyRelatedManager`.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@8415 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit a949f9ec7d8bdd348f628c2d579f4cc633c56e56 1 parent a2be52f
Gary Wilson Jr. authored August 16, 2008
17  django/db/models/fields/related.py
@@ -311,6 +311,13 @@ def create(self, **kwargs):
@@ -409,6 +416,16 @@ def create(self, **kwargs):
0  tests/regressiontests/get_or_create_regress/__init__.py
No changes.
91  tests/regressiontests/get_or_create_regress/models.py
... ...
@@ -0,0 +1,91 @@
  1
+from django.db import models
  2
+
  3
+class Publisher(models.Model):
  4
+    name = models.CharField(max_length=100)
  5
+
  6
+class Author(models.Model):
  7
+    name = models.CharField(max_length=100)
  8
+
  9
+class Book(models.Model):
  10
+    name = models.CharField(max_length=100)
  11
+    authors = models.ManyToManyField(Author, related_name='books')
  12
+    publisher = models.ForeignKey(Publisher, related_name='books')
  13
+
  14
+
  15
+__test__ = {'one':"""
  16
+#
  17
+# RelatedManager
  18
+#
  19
+
  20
+# First create a Publisher.
  21
+>>> p = Publisher.objects.create(name='Acme Publishing')
  22
+
  23
+# Create a book through the publisher.
  24
+>>> book, created = p.books.get_or_create(name='The Book of Ed & Fred')
  25
+>>> created
  26
+True
  27
+
  28
+# The publisher should have one book.
  29
+>>> p.books.count()
  30
+1
  31
+
  32
+# Try get_or_create again, this time nothing should be created.
  33
+>>> book, created = p.books.get_or_create(name='The Book of Ed & Fred')
  34
+>>> created
  35
+False
  36
+
  37
+# And the publisher should still have one book.
  38
+>>> p.books.count()
  39
+1
  40
+
  41
+#
  42
+# ManyRelatedManager
  43
+#
  44
+
  45
+# Add an author to the book.
  46
+>>> ed, created = book.authors.get_or_create(name='Ed')
  47
+>>> created
  48
+True
  49
+
  50
+# Book should have one author.
  51
+>>> book.authors.count()
  52
+1
  53
+
  54
+# Try get_or_create again, this time nothing should be created.
  55
+>>> ed, created = book.authors.get_or_create(name='Ed')
  56
+>>> created
  57
+False
  58
+
  59
+# And the book should still have one author.
  60
+>>> book.authors.count()
  61
+1
  62
+
  63
+# Add a second author to the book.
  64
+>>> fred, created = book.authors.get_or_create(name='Fred')
  65
+>>> created
  66
+True
  67
+
  68
+# The book should have two authors now.
  69
+>>> book.authors.count()
  70
+2
  71
+
  72
+# Create an Author not tied to any books.
  73
+>>> Author.objects.create(name='Ted')
  74
+<Author: Author object>
  75
+
  76
+# There should be three Authors in total. The book object should have two.
  77
+>>> Author.objects.count()
  78
+3
  79
+>>> book.authors.count()
  80
+2
  81
+
  82
+# Try creating a book through an author.
  83
+>>> ed.books.get_or_create(name="Ed's Recipies", publisher=p)
  84
+(<Book: Book object>, True)
  85
+
  86
+# Now Ed has two Books, Fred just one.
  87
+>>> ed.books.count()
  88
+2
  89
+>>> fred.books.count()
  90
+1
  91
+"""}

0 notes on commit a949f9e

Please sign in to comment.
Something went wrong with that request. Please try again.