考虑以下模型:
class Arena(models.Model):
crowd_capacity = models.PositiveInteger()
# more fields here
class Section(models.Model):
name = models.CharField(max_length=10)
crowd_capacity = models.PositiveInteger()
arena = models.ForeignKey(Arena, related_name='sections')
管理员.py:
class SectionInline(admin.StackedInline):
model = Section
fk_name = 'arena'
extra = 1
class ArenaAdmin(admin.ModelAdmin):
inlines = [
SectionInline,
]
我想添加一个验证方法来检查所有section.crowd_capacity 的总和是否不超过arena.crowd_capacity 的总和。
起初我想用干净的方法编写一个自定义的 SectionFormSet,但后来我没有看到如何获取 arena.crowd_capacity。
我还尝试向 Arena 添加 clean 方法,它确实显示了一个不错的红色验证错误,但不能解决问题。看起来 Arena clean 方法在保存所有部分后运行,并且更改 section.crowd_capacity 和 we section 有问题没有效果。
我尝试的验证方法:
def clean(self):
super(Arena, self).clean()
capacity = 0
for s in self.sections.all():
capacity += s.crowd_capacity
if capacity > self.crowd_capacity:
raise ValidationError('The sum of all sections crowd capacity '
'exceeds arena crowd capacity')