複合主キーは使えない
models.pyに定義したテーブルを更新する際に気がついたのですが、djangoでは複合主キーは使えないようです。
仕様であれば仕方ないので解決策を探す。
サロゲートキーを追加し複合主キーとして登録したかったフィールドをunique_togetherを使ってユニーク制約をつけることができる。
それとmodels.pyで定義したモデルでprimary_key=Trueの設定がないままにmake migrationsコマンド実行すると、idというフィールドが勝手に追加されるようです。
■変更前(このままだとエラーになる)
from django.db import models
# 株価情報を保持するモデル
class Stock(models.Model):
# Symbol
symbol = models.CharField(primary_key=True, max_length=10)
# Date
date = models.DateField(primary_key=True)
# High
high = models.FloatField()
# Low
low = models.FloatField()
# Open
open = models.FloatField()
# Close
close = models.FloatField()
# Volume
volume = models.IntegerField()
# Adj Close
adj_close = models.FloatField()
■変更後
from django.db import models
# 株価情報を保持するモデル
class Stock(models.Model):
# Symbol
symbol = models.CharField(max_length=10)
# Date
date = models.DateField()
# High
high = models.FloatField()
# Low
low = models.FloatField()
# Open
open = models.FloatField()
# Close
close = models.FloatField()
# Volume
volume = models.IntegerField()
# Adj Close
adj_close = models.FloatField()
class Meta:
constraints = [
# symbolとdateでユニーク制約
models.UniqueConstraint(fields=['symbol', 'date'], name='unique_stock')
]
これでOKです!
unique_togetherを使用して解決しようと思っていましたが、以下の記載がありましたのでUniqueConstraintを使用することに決めました。
Use UniqueConstraint with the constraints option instead.
UniqueConstraint provides more functionality than unique_together. unique_together may be deprecated in the future.
この記事が気に入ったらサポートをしてみませんか?