class ForeignKey(othermodel, on_delete, **options)
[source]
A many-to-one relationship. Requires a positional argument: the class to which the model is related.
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.
To create a recursive relationship – an object that has a many-to-one relationship with itself – use models.ForeignKey('self',
on_delete=models.CASCADE)
.
If you need to create a relationship on a model that has not yet been defined, you can use the name of the model, rather than the model object itself:
from django.db import models class Car(models.Model): manufacturer = models.ForeignKey( 'Manufacturer', on_delete=models.CASCADE, ) # ... class Manufacturer(models.Model): # ... pass
Relationships defined this way on abstract models are resolved when the model is subclassed as a concrete model and are not relative to the abstract model’s app_label
:
from django.db import models class AbstractCar(models.Model): manufacturer = models.ForeignKey('Manufacturer', on_delete=models.CASCADE) class Meta: abstract = True
from django.db import models from products.models import AbstractCar class Manufacturer(models.Model): pass class Car(AbstractCar): pass # Car.manufacturer will point to `production.Manufacturer` here.
To refer to models defined in another application, you can explicitly specify a model with the full application label. For example, if the Manufacturer
model above is defined in another application called production
, you’d need to use:
class Car(models.Model): manufacturer = models.ForeignKey( 'production.Manufacturer', on_delete=models.CASCADE, )
This sort of reference can be useful when resolving circular import dependencies between two applications.
A database index is automatically created on the ForeignKey
. You can disable this by setting db_index
to False
. You may want to avoid the overhead of an index if you are creating a foreign key for consistency rather than joins, or if you will be creating an alternative index like a partial or multiple column index.
Please login to continue.