Django: imposta la chiave esterna usando l’intero?

C’è un modo per impostare una relazione di chiave esterna usando l’ID intero di un modello? Questo sarebbe per scopi di ottimizzazione.

Ad esempio, supponiamo di avere un modello Employee:

class Employee(models.Model): first_name = models.CharField(max_length=100) last_name = models.CharField(max_length=100) type = models.ForeignKey('EmployeeType') 

e

 EmployeeType(models.Model): type = models.CharField(max_length=100) 

Voglio la flessibilità di avere tipi di dipendenti illimitati, ma nell’applicazione distribuita probabilmente ci sarà un solo tipo quindi mi chiedo se c’è un modo per codificare l’id e impostare la relazione in questo modo. In questo modo posso evitare una chiamata db per ottenere prima l’object EmployeeType.

Sì:

 employee = Employee(first_name="Name", last_name="Name") employee.type_id = 4 employee.save() 

ForeignKey campi ForeignKey memorizzano il loro valore in un attributo con _id alla fine, a cui puoi accedere direttamente per evitare di visitare il database.

La versione _id di ForeignKey è un aspetto particolarmente utile di Django, che tutti dovrebbero conoscere e utilizzare di volta in volta quando appropriato.

avvertimento:

@RuneKaagaard sottolinea che employee.type non è accurato in seguito nelle ultime versioni di Django, anche dopo aver chiamato employee.save() (mantiene il suo vecchio valore). Ovviamente, l’utilizzo di questo metodo vanificherebbe lo scopo dell’ottimizzazione di cui sopra, ma preferirei una query aggiuntiva accidentale a non essere corretta. Quindi, fai attenzione, usalo solo quando hai finito di lavorare sulla tua istanza (ad esempio un employee ).

Un’alternativa che utilizza create per creare l’object e salvarlo nel database in una riga:

 employee = Employee.objects.create(first_name='first', last_name='last', type_id=4)