【发布时间】:2012-02-09 17:29:35
【问题描述】:
假设我有这两个模型:
class Distribution(models.Model):
name = models.CharField(max_length=32)
class Component(models.Model):
distribution = models.ForeignKey(Distribution)
percentage = models.IntegerField()
我使用简单的TabularInline 在Distribution 管理表单中显示Components:
class ComponentInline(admin.TabularInline):
model = Component
extra = 1
class DistributionAdmin(admin.ModelAdmin):
inlines = [ComponentInline]
因此,我的目标是在保存之前验证 Distribution 的所有 Components 的百分比是否为 100。听起来很简单,所以我做了:
# ... Inside the Distribution model
def clean(self):
# Sum of components must be 100
total_sum = sum(comp.percentage for comp in self.component_set.all())
if total_sum != 100:
raise ValidationError('Sum of components must be 100%')
但这永远不会起作用,因为在Django中,所有对象都是在保存其外键或many2many相关对象之前保存的,这不是缺陷,它有一个原因:它不能先保存相关对象,因为对象它们相关的尚未定义id(id 是None,直到对象第一次保存在数据库中)。
我确定我不是第一个遇到这个问题的人。那么,有没有办法完成我想要做的事情?我在想也许是使用TabularInline 或ModelAdmin 的管理员黑客...?
【问题讨论】:
标签: python django foreign-keys