Django: Yabancı anahtarı tamsayı kullanarak ayarla?


104

Bir modelin tamsayı kimliğini kullanarak yabancı anahtar ilişkisini ayarlamanın bir yolu var mı? Bu, optimizasyon amaçlı olacaktır.

Örneğin, bir Çalışan modelim 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)

Sınırsız çalışan türüne sahip olma esnekliğini istiyorum, ancak dağıtılan uygulamada muhtemelen yalnızca tek bir tür olacak, bu nedenle kimliği sabit kodlamanın ve ilişkiyi bu şekilde ayarlamanın bir yolu olup olmadığını merak ediyorum. Bu şekilde önce EmployeeType nesnesini almak için bir db çağrısından kaçınabilirim.

Yanıtlar:


206

Evet:

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

ForeignKeyalanlar, değerlerini _id, veritabanını ziyaret etmekten kaçınmak için doğrudan erişebileceğiniz, sonunda bir öznitelikte saklar .

A _idsürümü, ForeignKeyDjango'nun özellikle yararlı bir yönüdür, herkesin bilmesi ve uygun olduğunda zaman zaman kullanması gerekir.

uyarı:

@RuneKaagaard employee.type, son Django sürümlerinde, arandıktan sonra bile employee.save()(eski değerini koruyor) bunun doğru olmadığını belirtiyor . Bunu kullanmak elbette yukarıdaki optimizasyonun amacını ortadan kaldırır, ancak yanlışlıkla fazladan bir sorgunun yanlış olmasını tercih ederim. Bu yüzden dikkatli olun, bunu yalnızca örneğiniz üzerinde çalışmayı bitirdiğinizde kullanın (örneğin employee).


10
Bu belgelenmiş mi?
Scott Stafford

8
Yabancı anahtar değerlerini doğrudan kullanma: docs.djangoproject.com/en/1.8/topics/db/optimization/…
Dan Oliphant

1
Bunu bugün Django 1.7'de test ettim ve orada bu iyi bir fikir değil. Çalışırken ve typealan veritabanına yazılırken, typedaha sonra mülke erişirseniz değişikliği yansıtmaz. Kod olarak söylendi, bu başarısız olur assert(employe.type.id == 4).
Rune Kaagaard

3
@AmichaiSchreiber Django'nun bir sonraki sürümünün bu sorunu çözeceğine inanıyorum
Will Hardy

2
Gelecekte buraya gelen herkes için bu sorun Django 2.1'de düzeltildi .
humcat

45

Kullandığı bu alternatif oluşturmak nesne oluşturmak ve tek satırda veritabanına kaydetmek için:

employee = Employee.objects.create(first_name='first', last_name='last', type_id=4)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.