mirror of
				https://github.com/django/django.git
				synced 2025-11-03 21:25:09 +00:00 
			
		
		
		
	Consolidated get_or_create tests.
This commit is contained in:
		
							parent
							
								
									3f01e82c59
								
							
						
					
					
						commit
						25b2ce896b
					
				
					 5 changed files with 75 additions and 90 deletions
				
			
		| 
						 | 
				
			
			@ -1,11 +1,3 @@
 | 
			
		|||
"""
 | 
			
		||||
33. get_or_create()
 | 
			
		||||
 | 
			
		||||
``get_or_create()`` does what it says: it tries to look up an object with the
 | 
			
		||||
given parameters. If an object isn't found, it creates one with the given
 | 
			
		||||
parameters.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
from __future__ import unicode_literals
 | 
			
		||||
 | 
			
		||||
from django.db import models
 | 
			
		||||
| 
						 | 
				
			
			@ -42,3 +34,17 @@ class Tag(models.Model):
 | 
			
		|||
class Thing(models.Model):
 | 
			
		||||
    name = models.CharField(max_length=256)
 | 
			
		||||
    tags = models.ManyToManyField(Tag)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Publisher(models.Model):
 | 
			
		||||
    name = models.CharField(max_length=100)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Author(models.Model):
 | 
			
		||||
    name = models.CharField(max_length=100)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Book(models.Model):
 | 
			
		||||
    name = models.CharField(max_length=100)
 | 
			
		||||
    authors = models.ManyToManyField(Author, related_name='books')
 | 
			
		||||
    publisher = models.ForeignKey(Publisher, related_name='books', db_column="publisher_id_column")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,7 +8,8 @@ from django.db import IntegrityError, DatabaseError
 | 
			
		|||
from django.utils.encoding import DjangoUnicodeDecodeError
 | 
			
		||||
from django.test import TestCase, TransactionTestCase
 | 
			
		||||
 | 
			
		||||
from .models import DefaultPerson, Person, ManualPrimaryKeyTest, Profile, Tag, Thing
 | 
			
		||||
from .models import (DefaultPerson, Person, ManualPrimaryKeyTest, Profile,
 | 
			
		||||
    Tag, Thing, Publisher, Author)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class GetOrCreateTests(TestCase):
 | 
			
		||||
| 
						 | 
				
			
			@ -237,3 +238,62 @@ class UpdateOrCreateTests(TestCase):
 | 
			
		|||
        except IntegrityError:
 | 
			
		||||
            formatted_traceback = traceback.format_exc()
 | 
			
		||||
            self.assertIn('obj.save', formatted_traceback)
 | 
			
		||||
 | 
			
		||||
    def test_related(self):
 | 
			
		||||
        p = Publisher.objects.create(name="Acme Publishing")
 | 
			
		||||
        # Create a book through the publisher.
 | 
			
		||||
        book, created = p.books.get_or_create(name="The Book of Ed & Fred")
 | 
			
		||||
        self.assertTrue(created)
 | 
			
		||||
        # The publisher should have one book.
 | 
			
		||||
        self.assertEqual(p.books.count(), 1)
 | 
			
		||||
 | 
			
		||||
        # Try get_or_create again, this time nothing should be created.
 | 
			
		||||
        book, created = p.books.get_or_create(name="The Book of Ed & Fred")
 | 
			
		||||
        self.assertFalse(created)
 | 
			
		||||
        # And the publisher should still have one book.
 | 
			
		||||
        self.assertEqual(p.books.count(), 1)
 | 
			
		||||
 | 
			
		||||
        # Add an author to the book.
 | 
			
		||||
        ed, created = book.authors.get_or_create(name="Ed")
 | 
			
		||||
        self.assertTrue(created)
 | 
			
		||||
        # The book should have one author.
 | 
			
		||||
        self.assertEqual(book.authors.count(), 1)
 | 
			
		||||
 | 
			
		||||
        # Try get_or_create again, this time nothing should be created.
 | 
			
		||||
        ed, created = book.authors.get_or_create(name="Ed")
 | 
			
		||||
        self.assertFalse(created)
 | 
			
		||||
        # And the book should still have one author.
 | 
			
		||||
        self.assertEqual(book.authors.count(), 1)
 | 
			
		||||
 | 
			
		||||
        # Add a second author to the book.
 | 
			
		||||
        fred, created = book.authors.get_or_create(name="Fred")
 | 
			
		||||
        self.assertTrue(created)
 | 
			
		||||
 | 
			
		||||
        # The book should have two authors now.
 | 
			
		||||
        self.assertEqual(book.authors.count(), 2)
 | 
			
		||||
 | 
			
		||||
        # Create an Author not tied to any books.
 | 
			
		||||
        Author.objects.create(name="Ted")
 | 
			
		||||
 | 
			
		||||
        # There should be three Authors in total. The book object should have two.
 | 
			
		||||
        self.assertEqual(Author.objects.count(), 3)
 | 
			
		||||
        self.assertEqual(book.authors.count(), 2)
 | 
			
		||||
 | 
			
		||||
        # Try creating a book through an author.
 | 
			
		||||
        _, created = ed.books.get_or_create(name="Ed's Recipes", publisher=p)
 | 
			
		||||
        self.assertTrue(created)
 | 
			
		||||
 | 
			
		||||
        # Now Ed has two Books, Fred just one.
 | 
			
		||||
        self.assertEqual(ed.books.count(), 2)
 | 
			
		||||
        self.assertEqual(fred.books.count(), 1)
 | 
			
		||||
 | 
			
		||||
        # Use the publisher's primary key value instead of a model instance.
 | 
			
		||||
        _, created = ed.books.get_or_create(name='The Great Book of Ed', publisher_id=p.id)
 | 
			
		||||
        self.assertTrue(created)
 | 
			
		||||
 | 
			
		||||
        # Try get_or_create again, this time nothing should be created.
 | 
			
		||||
        _, created = ed.books.get_or_create(name='The Great Book of Ed', publisher_id=p.id)
 | 
			
		||||
        self.assertFalse(created)
 | 
			
		||||
 | 
			
		||||
        # The publisher should have three books.
 | 
			
		||||
        self.assertEqual(p.books.count(), 3)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,15 +0,0 @@
 | 
			
		|||
from django.db import models
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Publisher(models.Model):
 | 
			
		||||
    name = models.CharField(max_length=100)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Author(models.Model):
 | 
			
		||||
    name = models.CharField(max_length=100)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Book(models.Model):
 | 
			
		||||
    name = models.CharField(max_length=100)
 | 
			
		||||
    authors = models.ManyToManyField(Author, related_name='books')
 | 
			
		||||
    publisher = models.ForeignKey(Publisher, related_name='books', db_column="publisher_id_column")
 | 
			
		||||
| 
						 | 
				
			
			@ -1,66 +0,0 @@
 | 
			
		|||
from __future__ import unicode_literals
 | 
			
		||||
 | 
			
		||||
from django.test import TestCase
 | 
			
		||||
 | 
			
		||||
from .models import Author, Publisher
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class GetOrCreateTests(TestCase):
 | 
			
		||||
    def test_related(self):
 | 
			
		||||
        p = Publisher.objects.create(name="Acme Publishing")
 | 
			
		||||
        # Create a book through the publisher.
 | 
			
		||||
        book, created = p.books.get_or_create(name="The Book of Ed & Fred")
 | 
			
		||||
        self.assertTrue(created)
 | 
			
		||||
        # The publisher should have one book.
 | 
			
		||||
        self.assertEqual(p.books.count(), 1)
 | 
			
		||||
 | 
			
		||||
        # Try get_or_create again, this time nothing should be created.
 | 
			
		||||
        book, created = p.books.get_or_create(name="The Book of Ed & Fred")
 | 
			
		||||
        self.assertFalse(created)
 | 
			
		||||
        # And the publisher should still have one book.
 | 
			
		||||
        self.assertEqual(p.books.count(), 1)
 | 
			
		||||
 | 
			
		||||
        # Add an author to the book.
 | 
			
		||||
        ed, created = book.authors.get_or_create(name="Ed")
 | 
			
		||||
        self.assertTrue(created)
 | 
			
		||||
        # The book should have one author.
 | 
			
		||||
        self.assertEqual(book.authors.count(), 1)
 | 
			
		||||
 | 
			
		||||
        # Try get_or_create again, this time nothing should be created.
 | 
			
		||||
        ed, created = book.authors.get_or_create(name="Ed")
 | 
			
		||||
        self.assertFalse(created)
 | 
			
		||||
        # And the book should still have one author.
 | 
			
		||||
        self.assertEqual(book.authors.count(), 1)
 | 
			
		||||
 | 
			
		||||
        # Add a second author to the book.
 | 
			
		||||
        fred, created = book.authors.get_or_create(name="Fred")
 | 
			
		||||
        self.assertTrue(created)
 | 
			
		||||
 | 
			
		||||
        # The book should have two authors now.
 | 
			
		||||
        self.assertEqual(book.authors.count(), 2)
 | 
			
		||||
 | 
			
		||||
        # Create an Author not tied to any books.
 | 
			
		||||
        Author.objects.create(name="Ted")
 | 
			
		||||
 | 
			
		||||
        # There should be three Authors in total. The book object should have two.
 | 
			
		||||
        self.assertEqual(Author.objects.count(), 3)
 | 
			
		||||
        self.assertEqual(book.authors.count(), 2)
 | 
			
		||||
 | 
			
		||||
        # Try creating a book through an author.
 | 
			
		||||
        _, created = ed.books.get_or_create(name="Ed's Recipes", publisher=p)
 | 
			
		||||
        self.assertTrue(created)
 | 
			
		||||
 | 
			
		||||
        # Now Ed has two Books, Fred just one.
 | 
			
		||||
        self.assertEqual(ed.books.count(), 2)
 | 
			
		||||
        self.assertEqual(fred.books.count(), 1)
 | 
			
		||||
 | 
			
		||||
        # Use the publisher's primary key value instead of a model instance.
 | 
			
		||||
        _, created = ed.books.get_or_create(name='The Great Book of Ed', publisher_id=p.id)
 | 
			
		||||
        self.assertTrue(created)
 | 
			
		||||
 | 
			
		||||
        # Try get_or_create again, this time nothing should be created.
 | 
			
		||||
        _, created = ed.books.get_or_create(name='The Great Book of Ed', publisher_id=p.id)
 | 
			
		||||
        self.assertFalse(created)
 | 
			
		||||
 | 
			
		||||
        # The publisher should have three books.
 | 
			
		||||
        self.assertEqual(p.books.count(), 3)
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue