Python

【Django 必修スキル】 modelリレーションで親のpkを子のモデルから取得する方法

リレーションで子側のモデルのデータを編集した後に、親側のページに遷移し、戻ってくるようにしたい場合、

「あれ?子のページで、親のページのプライマリーキー(pk)を、どうやって取得するの?」

と疑問が生まれると思います。

この記事では、その手法について紹介します。

リレーション、リレーションフィールドとは何か?

まず、リレーションという言葉について知っておく必要があります。

djangoのデータベースで複数のモデルを扱う際、モデルを関係付け(紐付け)をすることを「リレーション」と呼びます。

そのリレーションを行うフィールドを、「リレーションフィールド」と呼びます。

例えば、よく使われるForeignKeyは、他モデルと多対一のリレーションを持つフィールドを作成するときに使用されます。

このForeignKeyを「リレーションフィールド」と呼びます。

リレーションフィールドは様々なものがありますが、今回の記事では、ForeignKeyについて解説します。

グローバル変数を使って親のpkを取得する

グローバル変数を使って、親データのpkを簡単に取得することができます。

例えば、DeleteMeiboViewViewというクラスベースビューをもとに考えてみます。

【views.py】

※pearent_pkに親のpkの値を取得して代入しています。


class DeleteMeiboView(LoginRequiredMixin, DeleteView):

pearent_pk = 0 ←グローバル変数をおく
def get_context_data(self, **kwargs):
  global pearent_pk

#紐ついている親データを取得し、pkの値を取得する
obj = Meibolist.objects.get(pk=self.kwargs['pk'])
pearent_pk=obj.gakkyu_model.pk
return context

def get_success_url(self):
return reverse('APPname:******',kwargs={'pk': pearent_pk})

models.py

GakkyuModel(親)とMeibolist(子)の2つのモデルがあるものとしています。

class GakkyuModel(models.Model):
GakkyuName = models.CharField(
verbose_name='タイトル',
max_length=30,
null=True,
blank=True,
)

class Meibolist(models.Model):
gakkyu_model = models.ForeignKey(
GakkyuModel,
default=1,
on_delete=models.CASCADE,
)
group_name = models.CharField(
max_length=100,
)
ABOUT ME
den
完全独学でWEBデザインを無謀にも挑戦している中年男。 工場勤務の会社員で3児の父。 チャレンジを忘れず、妻に怒られても心はおれず。 有益な情報を発信し、これを見ている人の為になればと思っています。
関連記事一覧