
Generating by ChatGPT-4o
在上一篇《我獨自 Django:快速打造天氣 API 服務(上篇)》中,我們介紹了如何串接開源天氣 API,以實現快速且即時的天氣資料查詢。這樣的方式雖然輕量又方便,但在實際專案中,需求往往不只於此。當你需要進一步進行數據分析、比對趨勢或產生圖表時,歷史資料的建立與儲存便成為不可或缺的一環。
本篇會介紹方法二 : 建立屬於自己的資料庫 。我們會先將外部 API 的天氣數據儲存下來,再透過設計 API 介面來實現歷史資料的查詢與運用。
在正式實作之前,有幾個重要的前置觀念需要先說明。首先是資料模型 (Models) 的建立。Django 框架本身提供了與資料庫互動的機制,讓我們可以透過 Model 定義資料結構,進行資料的新增、查詢、更新與刪除(CRUD)操作。
而建立 Models 有兩種常見的做法 :
- 直接在 Django 中定義模型,並透過
migrate
指令建立資料表 (Table) : 這種方式比較符合 Django 的設計,能完整掌控資料表的結構,如果是新專案建議使用這種方式。 - 從現有資料庫反向建立模型 : 也就是直接使用已存在的資料表,再透過 Django 對應的工具
insepectdb
產出 Model 程式碼。
第二點就是排程的設定,排程的方法有很多,這邊會使用適合 Django 的排程功能,每日去 call API 將需要的資料寫入 DB,藉此逐漸累積歷史資料。
最後就是 API 的設計結構,為了以後的維護與擴展,良好的 API 架構設計至關重要。本篇將帶領讀者一步步建立具備可讀性、可擴充性的標準 API 架構。
*部分的程式因為 blog 的編譯器會有點跑版,可以到我的 Medium 觀看更好複製的版本
我們接著回到程式,如果有跟上每個步驟,目前的資料架構會是 :
WEB-PROJECT/
backend/
config/
settings.py
urls.py
...
weather/
views.py
urls.py
django-backend/
manage.py
frontend/
.gitignore
再來到 weather/models.py
建立 Table 結構,輸入以下程式碼 :
from django.db import models
class Weather(models.Model):
city = models.CharField(max_length=100)
temperature = models.FloatField()
windspeed = models.FloatField()
time = models.DateTimeField()
def __str__(self):
return f"{self.city} - {self.time}"
class Meta:
db_table = 'weather_data' # Table 名稱
確認你的 config/settings.py
有正確設定 :
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'backend', # 資料庫名稱
'USER': 'root',
'PASSWORD': '',
'HOST': '127.0.0.1',
'PORT': '3306', # 設定的 port
}
}
INSTALLED_APPS = [
...
'weather', # App 名稱
]
然後在 backend/
位置執行 :
python manage.py makemigrations
python manage.py migrate
回到 Database 看可以發現 Table 已經建立 :

migrate 結果
如果沒有建立,可以嘗試兩種解法 :
- 把
weather/migrations/
內剛剛建立的 migration 刪掉,應該是 0002_xxxx.py,再重新執行一次上述的程式碼。 - 若還是不行,就直接到用 SQL 語法建立 :
CREATE TABLE `weather_data` (
`id` BIGINT AUTO_INCREMENT PRIMARY KEY,
`city` VARCHAR(100) NOT NULL,
`temperature` FLOAT NOT NULL,
`windspeed` FLOAT NOT NULL,
`time` DATETIME NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
再來測試用 Django Shell 測試匯入是否成功 :
python manage.py shell
然後執行 :
from weather.models import Weather
from django.utils import timezone
# 建立一筆資料
Weather.objects.create( city="Taipei",
temperature=28.5,
windspeed=4.2,
time=timezone.now()
)
# 確認資料是否寫入成功
for w in Weather.objects.all():
print(w)
可以看到類似的資訊 Taipei-2025–05–03 03:08:13+00:00
,也可以回到 Database 上檢查是否有這筆的資訊 :

Django 匯入測試
至此,Django 匯入測試就完成了,未來若是有任何模型變更,再次執行 makemigrations 與 migrate 相關指令即可同步更新。
再來是透過現有的 Table 反向回去建立 Models.py 的方式,假設我們有個 Table 叫做 forecast_data
:
# 可以直接至 SQL Server 上使用
CREATE TABLE `forecast_data` (
`id` BIGINT AUTO_INCREMENT PRIMARY KEY,
`city` VARCHAR(100) NOT NULL,
`forecast_date` DATE NOT NULL,
`temperature_high` FLOAT NOT NULL,
`temperature_low` FLOAT NOT NULL,
`windspeed` FLOAT NOT NULL,
`description` VARCHAR(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
然後回到 backend/
:
python manage.py inspectdb forecast_data
你會在 terminal 上看到 Model 資訊 :

inspectdb 資訊
把 class 的部分複製到 weather/models.py
即可 :
from django.db import models
class Weather(models.Model):
city = models.CharField(max_length=100)
temperature = models.FloatField()
windspeed = models.FloatField()
time = models.DateTimeField()
def __str__(self):
return f"{self.city} - {self.time}"
class Meta:
db_table = 'weather_data' # Table 名稱
class ForecastData(models.Model):
id = models.BigAutoField(primary_key=True)
city = models.CharField(max_length=100)
forecast_date = models.DateField()
temperature_high = models.FloatField()
temperature_low = models.FloatField()
windspeed = models.FloatField()
description = models.CharField(max_length=255, blank=True, null=True)
class Meta:
managed = False # 告訴 Django : 這張表格不需要管理
db_table = 'forecast_data'
*特別提到 managed = False 的部分,可以把這一行刪除讓 Django 來控制這張表,重新執行一次 makemigrations 就好。
兩種方法都可以建立 Model,建立完 Model 之後,我們接著做序列化(Serialization),這是為了讓 Django 更方便的把資料轉為 JSON 格式,對於 API 的資料交換很重要。
到 weather/serializers.py
輸入以下程式碼 :
*若沒有 serializers.py
可自行建立。
from rest_framework import serializers
from .models import Weather
class WeatherSerializer(serializers.ModelSerializer):
class Meta:
model = Weather
fields = ['id', 'city', 'temperature', 'windspeed', 'time']
若缺少套件記得安裝 :
pip install djangorestframework
安裝完之後到 config/settings.py
添加 :
INSTALLED_APPS = [
...
'rest_framework',
...
]
以上完成 Django 與資料庫的連動。
接下來下篇《我獨自 Django:快速打造天氣 API 服務(下篇)》
將會學到 :
- 使用 Celery + Django 建立天氣資料的定時更新任務。
- 設計符合 RESTful 原則的 API 架構。