parts/django/tests/modeltests/get_or_create/tests.py
changeset 69 c6bca38c1cbf
equal deleted inserted replaced
68:5ff1fc726848 69:c6bca38c1cbf
       
     1 from datetime import date
       
     2 
       
     3 from django.db import IntegrityError
       
     4 from django.test import TransactionTestCase
       
     5 
       
     6 from models import Person, ManualPrimaryKeyTest
       
     7 
       
     8 
       
     9 class GetOrCreateTests(TransactionTestCase):
       
    10     def test_get_or_create(self):
       
    11         p = Person.objects.create(
       
    12             first_name='John', last_name='Lennon', birthday=date(1940, 10, 9)
       
    13         )
       
    14 
       
    15         p, created = Person.objects.get_or_create(
       
    16             first_name="John", last_name="Lennon", defaults={
       
    17                 "birthday": date(1940, 10, 9)
       
    18             }
       
    19         )
       
    20         self.assertFalse(created)
       
    21         self.assertEqual(Person.objects.count(), 1)
       
    22 
       
    23         p, created = Person.objects.get_or_create(
       
    24             first_name='George', last_name='Harrison', defaults={
       
    25                 'birthday': date(1943, 2, 25)
       
    26             }
       
    27         )
       
    28         self.assertTrue(created)
       
    29         self.assertEqual(Person.objects.count(), 2)
       
    30 
       
    31         # If we execute the exact same statement, it won't create a Person.
       
    32         p, created = Person.objects.get_or_create(
       
    33             first_name='George', last_name='Harrison', defaults={
       
    34                 'birthday': date(1943, 2, 25)
       
    35             }
       
    36         )
       
    37         self.assertFalse(created)
       
    38         self.assertEqual(Person.objects.count(), 2)
       
    39 
       
    40         # If you don't specify a value or default value for all required
       
    41         # fields, you will get an error.
       
    42         self.assertRaises(IntegrityError,
       
    43             Person.objects.get_or_create, first_name="Tom", last_name="Smith"
       
    44         )
       
    45 
       
    46         # If you specify an existing primary key, but different other fields,
       
    47         # then you will get an error and data will not be updated.
       
    48         m = ManualPrimaryKeyTest.objects.create(id=1, data="Original")
       
    49         self.assertRaises(IntegrityError,
       
    50             ManualPrimaryKeyTest.objects.get_or_create, id=1, data="Different"
       
    51         )
       
    52         self.assertEqual(ManualPrimaryKeyTest.objects.get(id=1).data, "Original")