Digamos que tengo estos dos modelos:inlines Validar antes de guardar el modelo
class Distribution(models.Model):
name = models.CharField(max_length=32)
class Component(models.Model):
distribution = models.ForeignKey(Distribution)
percentage = models.IntegerField()
y estoy usando un simple TabularInline
para mostrar Component
s dentro de la forma Distribution
admin:
class ComponentInline(admin.TabularInline):
model = Component
extra = 1
class DistributionAdmin(admin.ModelAdmin):
inlines = [ComponentInline]
Por lo tanto, mi objetivo es validar si los porcentajes de todos los Component
s de Distribution
suman 100 antes de guardarlo. Suena simple, por lo que hice:
# ... 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%')
Pero esto no va a funcionar el trabajo, ya que en Django todos los objetos se guardan antes de guardar sus objetos de clave externa o relacionados Many2Many, esto no es un defecto, que tiene una razón: no puede guardar primero los objetos relacionados, porque el objeto con el que están relacionados no tiene un id
definido aún (id
es None
hasta que el objeto se guarda por primera vez en el DB).
Estoy seguro de que no soy el primero en tener este problema. Entonces, ¿hay alguna manera de lograr lo que estoy tratando de hacer? Estaba pensando en tal vez un truco de administrador usando TabularInline
o ModelAdmin
...?
¡Esta es una buena idea! Sabía que los Inlines tenían mucho para ofrecer. Voy a intentar esto bien, ¡sé – juliomalegria
genial! Funcionó muy bien con un par de cambios. Gracias, realmente :) – juliomalegria
Me alegro de que funcionó :) – Alasdair