Djangoでいくつかの映画の評価データを表現しようとしています。これが私の問題を説明する私のモデルの簡略化されたバージョンです:
class RatingSystem(models.Model):
"""This denotes a rating authority and territory in which they operate"""
name = models.CharField(max_length=16)
territory = models.CharField(max_length=32)
class Rating(models.Model):
"""This represents a rating designation used by a rating system."""
code = models.CharField(max_length=16)
description = models.TextField()
system = models.ForeignKey(RatingSystem)
class FilmRating(models.Model):
"""This is a rating for a film and the reason why it received the rating.
Each film can have many ratings, but only one per rating system.
"""
rating = models.ForeignKey(Rating)
film = models.ForeignKey('Film')
reason = models.TextField()
class Film(models.Model):
"""Data for a film."""
title = models.CharField(max_length=64)
synopsis = models.TextField()
ratings = models.ManyToManyField(Rating, through=FilmRating)
コメントが示すように、各映画は複数の評価を持つことができますが、評価システムごとに1つの評価しかありません。たとえば、映画はMPAAによって「R」と「PG」の両方を評価することはできません。ただし、MPAAでは「R」、BBFCでは「15」と評価できます。
Djangoでこの制約を形式化するのに苦労しています。やりたいこと:
unique_together = ('film', 'rating__system')
しかし、FilmRating
そのような関係に従うことは許可されていないようです。純粋なSQLを使用している場合は、で複合主キーを作成code
してから、、で一意の制約を作成します。残念ながら、Djangoは複合キーをサポートしていません。のメソッドをオーバーライドすることを検討しましたが、可能であればデータベースレベルで制約を設定したいと思います。system
Rating
system
film
FilmRatings
save()
FilmRating
誰かがこれを行う方法を知っていますか?それが助けになるなら、テーブルの再構築もうまくいくでしょう。