summaryrefslogtreecommitdiff
path: root/django/db/models/base.py
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2009-03-06 04:51:05 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2009-03-06 04:51:05 +0000
commit53da1e47942f22a56e761d786ba89d05ca55a224 (patch)
treed7845386eddb1ec0eeb7d127e536248f53dc92c5 /django/db/models/base.py
parentb5d4a8ae1b63c35113ee225a15e819adb944b6a1 (diff)
Fixed #9649 -- Better error handling in model creation.
Previously, you could explicitly assign None to a non-null ForeignKey (or other) field when creating the model (Child(parent=None), etc). We now throw an exception when you do that, which matches the behaviour when you assign None to the attribute after creation. Thanks to ales.zoulek@gmail.com and ondrej.kohout@gmail.com for some analysis of this problem. git-svn-id: http://code.djangoproject.com/svn/django/trunk@9983 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/db/models/base.py')
-rw-r--r--django/db/models/base.py13
1 files changed, 7 insertions, 6 deletions
diff --git a/django/db/models/base.py b/django/db/models/base.py
index 50a701dce2..e704db2918 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -224,12 +224,13 @@ class Model(object):
# keywords, or default.
for field in fields_iter:
- rel_obj = None
+ is_related_object = False
if kwargs:
if isinstance(field.rel, ManyToOneRel):
try:
# Assume object instance was passed in.
rel_obj = kwargs.pop(field.name)
+ is_related_object = True
except KeyError:
try:
# Object instance wasn't passed in -- must be an ID.
@@ -245,11 +246,11 @@ class Model(object):
val = kwargs.pop(field.attname, field.get_default())
else:
val = field.get_default()
- # If we got passed a related instance, set it using the field.name
- # instead of field.attname (e.g. "user" instead of "user_id") so
- # that the object gets properly cached (and type checked) by the
- # RelatedObjectDescriptor.
- if rel_obj:
+ if is_related_object:
+ # If we are passed a related instance, set it using the
+ # field.name instead of field.attname (e.g. "user" instead of
+ # "user_id") so that the object gets properly cached (and type
+ # checked) by the RelatedObjectDescriptor.
setattr(self, field.name, rel_obj)
else:
setattr(self, field.attname, val)