Opened 16 years ago
Last modified 4 years ago
#10227 new
OneToOne fields with null=True raise DoesNotExist exception on related model — at Initial Version
Reported by: | rvdrijst | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | dev |
Severity: | Normal | Keywords: | onetoone related expection null |
Cc: | rvdrijst, eallik@…, olau@…, django@…, Sebastian Goll, Aymeric Augustin, cvrebert, Francis Devereux, mike@…, Ryan Hiebert, Peter Thomassen | Triage Stage: | Accepted |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Referencing a OneToOneField
with null=True
(i.e. it's optional) when there is no value set will return None
, as expected.
However, referencing the reverse side of the relation does not follow this behavior and raises a DoesNotExist
exception.
For example, in the following situation where Shop
s have optionally a Place
(e.g. webshops need not have a physical location):
class Place(models.Model) address = models.CharField(max_length=80) class Shop(models.Model) place = models.OneToOneField(Place, null=True) name = models.CharField(max_length=50) website = models.URLField()
This does work as expected:
>>> s1 = Shop.objects.create(name='Shop', website='shop.com') >>> print s1.place None
But this doesn't work as expected:
>>> p1 = Place.objects.create(address='123 somestr') >>> p1.shop ... [exception stack trace] ... DoesNotExist: Shop matching query does not exist.
I would expect this to be None
when null
is allowed on the OneToOneField
.
Please correct my if I'm wrong.
I have attached a patch to fix this (checking if null
is allowed and returning None
or raising the exception appropriately), including tests.
Unfortunately this is slightly backwards incompatible, since someone may currently rely on the exception being thrown.
Patch with fix and tests