mirror of
https://github.com/django/django.git
synced 2024-12-26 02:56:25 +00:00
e94d293504
other database backends, but the exception classes should still be the same. This commit changes the way the tests check for specific database errors to be more portable between implementations. It's possible these tests will still fail if, e.g., Oracle doesn't raise IntegrityError (but raises DatabaseError) when we except it to, but we can cross that bridge if and when it appears. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8450 bcc190cf-cafb-0310-a4f2-bffc1f526a37
65 lines
1.9 KiB
Python
65 lines
1.9 KiB
Python
"""
|
|
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 django.db import models, IntegrityError
|
|
|
|
class Person(models.Model):
|
|
first_name = models.CharField(max_length=100)
|
|
last_name = models.CharField(max_length=100)
|
|
birthday = models.DateField()
|
|
|
|
def __unicode__(self):
|
|
return u'%s %s' % (self.first_name, self.last_name)
|
|
|
|
__test__ = {'API_TESTS':"""
|
|
# Acting as a divine being, create an Person.
|
|
>>> from datetime import date
|
|
>>> p = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9))
|
|
>>> p.save()
|
|
|
|
# Only one Person is in the database at this point.
|
|
>>> Person.objects.count()
|
|
1
|
|
|
|
# get_or_create() a person with similar first names.
|
|
>>> p, created = Person.objects.get_or_create(first_name='John', last_name='Lennon', defaults={'birthday': date(1940, 10, 9)})
|
|
|
|
# get_or_create() didn't have to create an object.
|
|
>>> created
|
|
False
|
|
|
|
# There's still only one Person in the database.
|
|
>>> Person.objects.count()
|
|
1
|
|
|
|
# get_or_create() a Person with a different name.
|
|
>>> p, created = Person.objects.get_or_create(first_name='George', last_name='Harrison', defaults={'birthday': date(1943, 2, 25)})
|
|
>>> created
|
|
True
|
|
>>> Person.objects.count()
|
|
2
|
|
|
|
# If we execute the exact same statement, it won't create a Person.
|
|
>>> p, created = Person.objects.get_or_create(first_name='George', last_name='Harrison', defaults={'birthday': date(1943, 2, 25)})
|
|
>>> created
|
|
False
|
|
>>> Person.objects.count()
|
|
2
|
|
|
|
# If you don't specify a value or default value for all required fields, you
|
|
# will get an error.
|
|
>>> try:
|
|
... p, created = Person.objects.get_or_create(first_name='Tom', last_name='Smith')
|
|
... except Exception, e:
|
|
... if isinstance(e, IntegrityError):
|
|
... print "Pass"
|
|
... else:
|
|
... print "Fail with %s" % type(e)
|
|
Pass
|
|
"""}
|