Django:整数を使用して外部キーを設定しますか?


104

モデルの整数IDを使用して外部キー関係を設定する方法はありますか?これは最適化を目的としています。

たとえば、従業員モデルがあるとします。

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

そして

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

従業員のタイプを無制限にできる柔軟性が欲しいのですが、デプロイされたアプリケーションにはタイプが1つしかない可能性が高いので、IDをハードコードして関係をこのように設定する方法があるかどうか疑問に思っています。これにより、最初にEmployeeTypeオブジェクトを取得するdb呼び出しを回避できます。

回答:


205

うん:

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

ForeignKeyフィールドは値を属性_idの最後に格納します。データベースにアクセスしないように直接アクセスできます。

_ida のバージョンはForeignKeyDjangoの特に有用な側面であり、誰もが知っており、適切なときに随時使用する必要があります。

警告:

@RuneKaagaard employee.typeは、最近のDjangoバージョンでは、呼び出した後でさえ、正確ではないことを指摘してemployee.save()います(古い値を保持しています)。もちろん、それを使用すると上記の最適化の目的が損なわれますが、誤って追加のクエリを行うのは不正確であるよりも望ましいでしょう。したがって、注意してくださいemployee。これは、インスタンスでの作業が終了したときにのみ使用してください(例:)。


10
これは文書化されていますか?
スコットスタッフォード


1
今日私はDjango 1.7でこれをテストしましたが、そこでは良い考えではありません。動作し、typeフィールドがデータベースに書き込まれている間、type後でプロパティにアクセスしても、変更は反映されません。コードで言うと、これは失敗しassert(employe.type.id == 4)ます。
Rune Kaagaard 2017年

3
@AmichaiSchreiber Djangoの次のリリースでこの問題が修正されると思い
Will Hardy

2
将来ここに来る人のために、この問題はDjango 2.1で修正されています。
humcat

45

createを使用してオブジェクトを作成し、1行でデータベースに保存する別の方法:

employee = Employee.objects.create(first_name='first', last_name='last', type_id=4)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.