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:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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:
1 2 3 4 5 | >>> 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
:
1 2 3 4 | >>> 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.