次の(簡略化された)データ構造があります。
Site
-> Zone
-> Room
-> name
各ルームの名前をサイトごとに一意にしたい。
各ゾーンの一意性だけが必要な場合は、次のようにすることができます。
class Room(models.Model):
zone = models.ForeignKey(Zone)
name = models.CharField(max_length=255)
class Meta:
unique_together = ('name', 'zone')
しかし、私は本当にやりたいことができません。
class Room(models.Model):
zone = models.ForeignKey(Zone)
name = models.CharField(max_length=255)
class Meta:
unique_together = ('name', 'zone__site')
この質問で示唆されているように、validate_unique メソッドを追加してみました:
class Room(models.Model):
zone = models.ForeignKey(Zone)
name = models.CharField(max_length=255)
def validate_unique(self, exclude=None):
qs = Room.objects.filter(name=self.name)
if qs.filter(zone__site=self.zone__site).exists():
raise ValidationError('Name must be unique per site')
models.Model.validate_unique(self, exclude=exclude)
しかし、Room オブジェクトを保存するときに呼び出されないため、validate_unique のポイント/実装を誤解しているに違いありません。
このチェックを実装する正しい方法は何でしょうか?