class OneToOneField(othermodel, on_delete, parent_link=False, **options)
[source]
A one-to-one relationship. Conceptually, this is similar to a ForeignKey
with unique=True
, but the “reverse” side of the relation will directly return a single object.
on_delete
can now be used as the second positional argument (previously it was typically only passed as a keyword argument). It will be a required argument in Django 2.0.
This is most useful as the primary key of a model which “extends” another model in some way; Multi-table inheritance is implemented by adding an implicit one-to-one relation from the child model to the parent model, for example.
One positional argument is required: the class to which the model will be related. This works exactly the same as it does for ForeignKey
, including all the options regarding recursive and lazy relationships.
If you do not specify the related_name
argument for the OneToOneField
, Django will use the lower-case name of the current model as default value.
With the following example:
from django.conf import settings from django.db import models class MySpecialUser(models.Model): user = models.OneToOneField( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, ) supervisor = models.OneToOneField( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='supervisor_of', )
your resulting User
model will have the following attributes:
>>> user = User.objects.get(pk=1) >>> hasattr(user, 'myspecialuser') True >>> hasattr(user, 'supervisor_of') True
A DoesNotExist
exception is raised when accessing the reverse relationship if an entry in the related table doesn’t exist. For example, if a user doesn’t have a supervisor designated by MySpecialUser
:
>>> user.supervisor_of Traceback (most recent call last): ... DoesNotExist: User matching query does not exist.
Additionally, OneToOneField
accepts all of the extra arguments accepted by ForeignKey
, plus one extra argument:
Please login to continue.