diff options
| author | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2009-03-06 04:51:05 +0000 |
|---|---|---|
| committer | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2009-03-06 04:51:05 +0000 |
| commit | 53da1e47942f22a56e761d786ba89d05ca55a224 (patch) | |
| tree | d7845386eddb1ec0eeb7d127e536248f53dc92c5 /django/db/models/base.py | |
| parent | b5d4a8ae1b63c35113ee225a15e819adb944b6a1 (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.py | 13 |
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) |
