Django ForeignKeyとデータベースのFOEGN KEY制約について詳しく説明します。


データベースは高合併の場面で外接結合の制約を使うとロックが問題になり、外接キーを使うと運行維持コストが増加するので、多くの会社が生産環境のデータベースに外部キーの使用を禁止すると規定しています。
外部キー制約を使用しないでDjango ORMを使って、関連クエリの2つのテーブルはどうやって実現されますか?これは長い間悩んでいた問題ですが、今日やっと答えが見つかりました。書いて分かち合います。
DjangoのForeignKeyはデータベースのFOREGN KEYとは違っています。DjangoのForeignKeyは論理的に2つのテーブルの関連関係であり、データベースを使用するFOREGN KEY制約を指定できます。
冒頭のシーンでは、このように二つの表に対応するモデルを作成し、省と市の関連例を挙げます。

# demo/models.py
from django.db import models

class Province(models.Model):
  name = models.CharField(max_length=16)

  def __unicode__(self):
    return self.name

class City(models.Model):
  name = models.CharField(max_length=16)
  province = models.ForeignKey(Province, null=True, on_delete=models.SET_NULL,
                 related_name='cities', db_constraint=False)
  def __unicode__(self):
    return self.name
以上のmodels.pyがmigrateを実行する時に生成されるSQLは以下の通りです。

CREATE TABLE `demo_city` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(16) NOT NULL);
CREATE TABLE `demo_province` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(16) NOT NULL);
ALTER TABLE `demo_city` ADD COLUMN `province_id` integer NULL;
CREATE INDEX `demo_city_province_id_50fffd49` ON `demo_city` (`province_id`);
ForeignKeyが添加されていない場合db_constrant=Falseパラメータは、データベース内で外部キー制約を使用して、以下のSQLを生成します。
ALTER TABLE`democity`ADD CONSTRAINT`demo uシティprovinceid_aff 53934_fk_key_provinceid`FOREEGN KEY(province u)id`)REFERENCES`demo_province`
また、ForeignKeyのon_deleteパラメータはデフォルトはon(u)です。delete=models.CADEは、データベースのカスケードを使って削除することを表しています。delete=models.SET_NULLは、Provinceの削除時に関連するCityテーブルに対応するprovince_を実行できます。ID値はNULLに設定されています
このような方法を使うと、Djangoの逆関連クエリは破壊されません。以下のクエリは依然として正しい結果を返します。
Province.object s.filtername='xxx'
実際に実行されるSQLはInner Joinクエリである:
SELECT`デモprovince`。province`.name`FROM`demoprovince`INNER JOIN`democity`ON(`demo_)province`。city`.province_id`)WHERE`democity`.name`=xxx
補足知識:Djangoモデルについてaut_を定義します。now=Trueデータベースの時間は自動的に更新されていません。
djangoのormデータベースの更新方法についてはudateとsaveの2つの方法があります。
モデルにaut_を設置することを前提としている。now=Trueタイムスタンプのプロパティは、データベースの自動更新を容易にするために、
アップデートした記録を使って、データベースの中で自動的に更新していません。
autonow=True自動更新は、djangoのモデル層を通過する条件があります。
createやsave方法のようです。
filterの後にudate方法であれば、直接にsqlを呼び出し、モデル層を通りません。
この時間は自動的に更新されません。だから、save方法を使って更新してこそ、私のニーズに応えられます。
以上のDjango ForeignKeyとデータベースのFOREGN KEYの制約は詳細には、小編集が皆さんに共有している内容です。参考にしていただければと思います。どうぞよろしくお願いします。