我有以下(简化的)数据结构:
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)
但我一定误解了 validate_unique 的要点/实现,因为当我保存 Room 对象时它没有被调用。
实施此检查的正确方法是什么?