サイトアイコン 知的好奇心

Djangoで関連テーブルにレコードを追加する方法

Djangoで関連テーブルにレコードを追加する方法をご紹介します。

条件

モデル

場所:気象データ = 1:N になるようモデルを作成します。

以下がポイントです。

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)のレコード追加を行います。

手順は以下の通りです。

  1. ID指定でオブジェクトを取得
  2. 取得したオブジェクトに紐づくテーブルのレコードを追加

ソース

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/

モバイルバージョンを終了