Проверяйте встроенные строки перед сохранением модели

Допустим, у меня есть эти две модели:

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 ...?

6
задан juliomalegria 15 March 2015 в 09:03
поделиться