Is there a way to set foreign key relationship using the integer id of a model? This would be for optimization purposes.
For example, suppose I have an Employee model:
class Employee(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
type = models.ForeignKey('EmployeeType')
and
EmployeeType(models.Model):
type = models.CharField(max_length=100)
I want the flexibility of having unlimited employee types, but in the deployed application there will likely be only a single type so I'm wondering if there is a way to hardcode the id and set the relationship this way. This way I can avoid a db call to get the EmployeeType object first.
An alternative that uses create to create the object and save it to the database in one line:
Yep:
ForeignKey
fields store their value in an attribute with_id
at the end, which you can access directly to avoid visiting the database.The
_id
version of aForeignKey
is a particularly useful aspect of Django, one that everyone should know and use from time to time when appropriate.caveat:
@RuneKaagaard points out that
employee.type
is not accurate afterwards in recent Django versions, even after callingemployee.save()
(it holds its old value). Using it would of course defeat the purpose of the above optimisation, but I would prefer an accidental extra query to being incorrect. So be careful, only use this when you are finished working on your instance (egemployee
).