Kaydet (Commit) 90af2782 authored tarafından Tim Graham's avatar Tim Graham Kaydeden (comit) Tim Graham

Fixed #16137 - Removed kwargs requirement for QuerySet.get_or_create

Thanks wilfred@, poirier, and charettes for work
on the patch.
üst a64de33b
...@@ -363,8 +363,6 @@ class QuerySet(object): ...@@ -363,8 +363,6 @@ class QuerySet(object):
Returns a tuple of (object, created), where created is a boolean Returns a tuple of (object, created), where created is a boolean
specifying whether an object was created. specifying whether an object was created.
""" """
assert kwargs, \
'get_or_create() must be passed at least one keyword argument'
defaults = kwargs.pop('defaults', {}) defaults = kwargs.pop('defaults', {})
lookup = kwargs.copy() lookup = kwargs.copy()
for f in self.model._meta.fields: for f in self.model._meta.fields:
......
...@@ -1343,8 +1343,12 @@ get_or_create ...@@ -1343,8 +1343,12 @@ get_or_create
.. method:: get_or_create(**kwargs) .. method:: get_or_create(**kwargs)
A convenience method for looking up an object with the given kwargs, creating A convenience method for looking up an object with the given kwargs (may be
one if necessary. empty if your model has defaults for all fields), creating one if necessary.
.. versionchanged:: 1.6
Older versions of Django required ``kwargs``.
Returns a tuple of ``(object, created)``, where ``object`` is the retrieved or Returns a tuple of ``(object, created)``, where ``object`` is the retrieved or
created object and ``created`` is a boolean specifying whether a new object was created object and ``created`` is a boolean specifying whether a new object was
......
...@@ -280,6 +280,9 @@ Minor features ...@@ -280,6 +280,9 @@ Minor features
* The :exc:`~django.core.exceptions.DoesNotExist` exception now includes a * The :exc:`~django.core.exceptions.DoesNotExist` exception now includes a
message indicating the name of the attribute used for the lookup. message indicating the name of the attribute used for the lookup.
* The :meth:`~django.db.models.query.QuerySet.get_or_create` method no longer
requires at least one keyword argument.
Backwards incompatible changes in 1.6 Backwards incompatible changes in 1.6
===================================== =====================================
......
...@@ -21,6 +21,11 @@ class Person(models.Model): ...@@ -21,6 +21,11 @@ class Person(models.Model):
def __str__(self): def __str__(self):
return '%s %s' % (self.first_name, self.last_name) return '%s %s' % (self.first_name, self.last_name)
class DefaultPerson(models.Model):
first_name = models.CharField(max_length=100, default="Anonymous")
class ManualPrimaryKeyTest(models.Model): class ManualPrimaryKeyTest(models.Model):
id = models.IntegerField(primary_key=True) id = models.IntegerField(primary_key=True)
data = models.CharField(max_length=100) data = models.CharField(max_length=100)
......
...@@ -8,7 +8,7 @@ from django.db import IntegrityError, DatabaseError ...@@ -8,7 +8,7 @@ from django.db import IntegrityError, DatabaseError
from django.utils.encoding import DjangoUnicodeDecodeError from django.utils.encoding import DjangoUnicodeDecodeError
from django.test import TestCase, TransactionTestCase from django.test import TestCase, TransactionTestCase
from .models import Person, ManualPrimaryKeyTest, Profile, Tag, Thing from .models import DefaultPerson, Person, ManualPrimaryKeyTest, Profile, Tag, Thing
class GetOrCreateTests(TestCase): class GetOrCreateTests(TestCase):
...@@ -83,6 +83,14 @@ class GetOrCreateTests(TestCase): ...@@ -83,6 +83,14 @@ class GetOrCreateTests(TestCase):
else: else:
self.skipTest("This backend accepts broken utf-8.") self.skipTest("This backend accepts broken utf-8.")
def test_get_or_create_empty(self):
# Regression test for #16137: get_or_create does not require kwargs.
try:
DefaultPerson.objects.get_or_create()
except AssertionError:
self.fail("If all the attributes on a model have defaults, we "
"shouldn't need to pass any arguments.")
class GetOrCreateTransactionTests(TransactionTestCase): class GetOrCreateTransactionTests(TransactionTestCase):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment