Допустим, у меня есть эти две модели:
class Distribution(models.Model):
name = models.CharField(max_length=32)
class Component(models.Model):
distribution = models.ForeignKey(Distribution)
percentage = models.IntegerField()
И я использую простой TabularInline
, чтобы показать Component
внутри дистрибутива
административная форма:
class ComponentInline(admin.TabularInline):
model = Component
extra = 1
class DistributionAdmin(admin.ModelAdmin):
inlines = [ComponentInline]
Итак, моя цель - проверить, составляют ли проценты всех Компонент
из Распределения
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 все объекты сохраняются перед сохранением его внешнего ключа или многих связанных объектов, это не недостаток, у него есть причина: он не может сохранить связанные объекты, потому что у объекта, с которым они связаны, еще не определен id
( id
равен None
, пока объект не будет сохранен для первого время в БД).
Я уверен, что я не первый, кто столкнулся с этой проблемой. Итак, есть ли способ выполнить то, что я пытаюсь сделать? Я подумал, может быть, взломать админку с помощью TabularInline
или ModelAdmin
...?