diff -uNr a/django/db/models/query.py b/django/db/models/query.py --- a/django/db/models/query.py 2008-08-19 16:20:15.000000000 +0100 +++ b/django/db/models/query.py 2008-08-19 16:21:13.000000000 +0100 @@ -327,7 +327,7 @@ params.update(defaults) obj = self.model(**params) sid = transaction.savepoint() - obj.save() + obj.save(force_insert=True) transaction.savepoint_commit(sid) return obj, True except IntegrityError, e: diff -uNr a/docs/db-api.txt b/docs/db-api.txt --- a/docs/db-api.txt 2008-08-19 16:20:36.000000000 +0100 +++ b/docs/db-api.txt 2008-08-19 16:24:05.000000000 +0100 @@ -1174,7 +1174,7 @@ obj = Person.objects.get(first_name='John', last_name='Lennon') except Person.DoesNotExist: obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9)) - obj.save() + obj.save(force_insert=True) This pattern gets quite unwieldy as the number of fields in a model goes up. The above example can be rewritten using ``get_or_create()`` like so:: @@ -1193,7 +1193,7 @@ params = dict([(k, v) for k, v in kwargs.items() if '__' not in k]) params.update(defaults) obj = self.model(**params) - obj.save() + obj.save(force_insert=True) In English, that means start with any non-``'defaults'`` keyword argument that doesn't contain a double underscore (which would indicate a non-exact lookup).