Djangoで関連テーブルにレコードを追加する方法をご紹介します。
目次
条件
- Python 3.7.0
- Django 2.2.3
モデル
場所:気象データ = 1:N になるようモデルを作成します。
以下がポイントです。
- location = models.ForeignKey(Location, verbose_name=’ロケーション’, on_delete=models.PROTECT)
from django.db import models from django.urls import reverse from datetime import datetime as dt class Location(models.Model): """場所モデル""" class Meta: db_table = 'location' name = models.CharField(verbose_name='ロケーション名', max_length=255) memo = models.CharField(verbose_name='メモ', max_length=255, default='', blank=True) author = models.ForeignKey( 'auth.User', on_delete=models.CASCADE, ) created_at = models.DateTimeField(verbose_name='登録日時', auto_now_add=True) updated_at = models.DateTimeField(verbose_name='更新日時', auto_now=True) def __str__(self): return self.name @staticmethod def get_absolute_url(self): return reverse('monitor:index') class WeatherData(models.Model): """気象データモデル""" class Meta: db_table = 'weather_data' unique_together = (('location', 'data_datetime'),) location = models.ForeignKey(Location, verbose_name='ロケーション', on_delete=models.PROTECT) data_datetime = models.DateTimeField(verbose_name='データ日時', default=dt.strptime('2001-01-01 00:00:00', '%Y-%m-%d %H:%M:%S')) temperature = models.FloatField(verbose_name='気温') humidity = models.FloatField(verbose_name='湿度') created_at = models.DateTimeField(verbose_name='登録日時', auto_now_add=True) updated_at = models.DateTimeField(verbose_name='更新日時', auto_now=True) def __str__(self): return self.location.name + ":" + str(self.data_datetime)
テーブルのレコード
以下のようなレコードが入っているものとします。
場所(Location)
気象データ(WeatherData)
関連テーブルへの追加
views.py等において、以下のような処理を記述します。
ここでは、場所(Location)に紐づく気象データ(WeatherData)のレコード追加を行います。
手順は以下の通りです。
- ID指定でオブジェクトを取得
- 取得したオブジェクトに紐づくテーブルのレコードを追加
ソース
from .models import Location ・・・ location = Location.objects.get(id=1) # 場所(Location)オブジェクトをID指定で取得 location.weatherdata_set.create( # 場所(Location)に紐づく気象データ(WeatherData)レコードを追加 data_datetime=datetime.now(), temperature=28.5, humidity=58.7, created_at=datetime.now() )
実行結果
指定した通りのレコードが追加されます。