![見出し画像](https://assets.st-note.com/production/uploads/images/48112005/rectangle_large_type_2_280549b27d8430d766ff3f566f0e82f7.jpeg?width=1200)
Photo by
mericanadesico
複合主キーは使えない
models.pyに定義したテーブルを更新する際に気がついたのですが、djangoでは複合主キーは使えないようです。
株価取得用テーブルに複合主キーを設定したかったけどdjangoでは対応していないらしい。
— ヤス@FIREを目指すプログラマー (@biz_yasu) March 19, 2021
■makemigrationsをした際のエラー
↓
The model cannot have more than one field with 'primary_key=True'.
複合主キー使わないのが主流なの???#Django #Python
仕様であれば仕方ないので解決策を探す。
サロゲートキーを追加し複合主キーとして登録したかったフィールドを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.
この記事が気に入ったらサポートをしてみませんか?