見出し画像

複合主キーは使えない

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.


この記事が気に入ったらサポートをしてみませんか?