リレーションで子側のモデルのデータを編集した後に、親側のページに遷移し、戻ってくるようにしたい場合、
「あれ?子のページで、親のページのプライマリーキー(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,
)