---
slug: "django-multiple-database-foreignkey"
title: "Django2.0 DB間にまたがった ForeignKey を作る"
description: "※ RDBの制約を作るという意味ではないです。とりあえず動く ForeignKey フィールドを作るという意味です。"
url: "https://www.ytyng.com/blog/django-multiple-database-foreignkey"
publish_date: "2018-05-15T03:24:56Z"
created: "2018-05-15T03:24:56Z"
updated: "2026-02-27T05:38:55.349Z"
categories: ["Django"]
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20230812/4294209815914e9a99562ba3d51bfdc5.png.webp?width=768"
has_video: false
has_music: false
video_urls: []
music_urls: []
lang: "ja"
---

# Django2.0 DB間にまたがった ForeignKey を作る

<p>※ RDBの制約を作るという意味ではないです。とりあえず動く ForeignKey フィールドを作るという意味です。</p>
<p></p>
<p>Django2.0で、別なDBを使うモデルに対して ForeignKey を作ろうとすると、save時に</p>
<pre class="exception_value">Cannot assign "&lt;YourModel&gt;": the current database router prevents this relation.</pre>
<p>というエラーが出て保存ができない。</p>
<p></p>
<p>その場合、データベースルータの allow_relation で True を返して、</p>
<pre><span>def </span>allow_relation(<span>self</span>, <span>obj1</span>, <span>obj2</span>):<br />    <span>if {obj1._meta.app_label, obj2._meta.app_label} \<br /></span><span>            == {'my_app_1', 'my_app_2'}:<br /></span><span>        return True<br /></span><span></span>&uarr; すべて True でも良さそうだけど、app_label で判断するならこんな感じか?<br />デフォルトで None</pre>
<p>https://docs.djangoproject.com/en/2.0/topics/db/multi-db/#allow_relation</p>
<p></p>
<p>ForeignKey を使うモデルを</p>
<pre>related_model = models.ForeignKey(<br />    YourModel, <span>on_delete</span>=models.DO_NOTHING,<br />    <span>db_constraint</span>=<span>False</span>, <span>null</span>=<span>True</span>, <span>blank</span>=<span>True</span>)</pre>
<p>このように db_constraint=False しておけば (こうしないとマイグレーションできない)</p>
<p>Foreign Key として動作するようになる。</p>
<p>が、コードにある通りDB上の制約は無い。</p>
<p></p>
