Djangoで関連テーブルにレコードを追加する方法
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()
)
実行結果
指定した通りのレコードが追加されます。
参考
Django公式:Related objects reference
https://docs.djangoproject.com/ja/2.2/ref/models/relations/





