2010-05-17 17 views
75

Bir modelin tamsayı kimliğini kullanarak yabancı anahtar ilişki kurmanın bir yolu var mı? Bu optimizasyon amaçlı olacaktır. ÖrneğinDjango: Tamsayı'yı kullanarak yabancı anahtarı mı ayarlıyorsunuz?

, bir Çalışan modeli olduğunu varsayalım:

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

ve

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

ben sınırsız çalışanın türlerini sahip esnekliğini istiyorum ama konuşlandırılmış uygulamada büyük olasılıkla yalnızca bir olacaktır Tek tip id bu yüzden ben id ismini kodlamak ve ilişkiyi bu şekilde ayarlamak için bir yol olup olmadığını merak ediyorum. Bu şekilde, önce EmployeeType nesnesini almak için bir db çağrısından kurtulabilirim.

cevap

171

Yep:

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

ForeignKey alanlar veritabanını ziyaret kaçınmak için doğrudan erişebilir sonunda _id ile bir ayrıntıda kendi değerini depolar.

ForeignKey10'un _id sürümü, herkesin bilmesi ve zaman zaman uygun şekilde kullanması gereken Django'nun kullanışlı bir yönüdür.

uyarı:

@RuneKaagaard employee.type bile (onun eski değerini tutan) employee.save() çağırdıktan sonra son Django sürümlerinde sonradan doğru olmadığını işaret ediyor. Bunu kullanmak, elbette yukarıdaki optimizasyonun amacını ortadan kaldırır, ancak yanlışlıkla yapılan ek bir sorgulamayı tercih ederim. Dikkatli olun, sadece örneğiniz üzerinde çalışmayı bitirdiğinizde kullanın (örn. employee).

+7

belgelenmiş mi? –

+0

[model '.save()'] (https://github.com/django/django/blob/731f313d604a6cc141f36d8a1ba9a75790c70154/django/db/models/base.py#L708) "attname" alanını kullanır (['pre_save () '' attname' değerini döndürür] (https://github.com/django/django/blob/master/django/db/models/fields/__init__.py#L602)). ForeignKeys için 'attname'' _id' soneki ismidir. Ayrıca, bir model örneğinin 'foobar_id' özniteliği, [otomatik olarak güncellenir] (https://github.com/django/django/blob/master/django/db/models/fields/related.py#L467) ayarlandığında 'foobar'. Ama resmi olarak nerede belgelendi? –

+5

Yabancı anahtar değerlerini doğrudan kullanma: https://docs.djangoproject.com/en/1.8/topics/db/optimization/#use-foreign-key-values-directly –

28

nesnesi oluşturmak ve tek satırda veritabanına kaydetmek için create kullanan bir alternatif: Bu

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