编辑现有对象时Django Formset触发模型数量限制验证错误的原因
问题解答
一、formset.save()实际执行的操作
用表单集编辑现有对象时,formset.save()默认执行以下操作:
- 对每个绑定了现有数据库实例的表单,调用该实例的
save()方法更新数据,不会新建对象也不会删除旧对象。 - 只有当表单集中的空白新增表单填写了数据时,才会创建新的
MyModel实例并调用save()保存。
你遇到验证错误的核心问题在于:你的MyModel.save()方法没有区分「更新现有对象」和「创建新对象」——数据库里已有5个实例,编辑保存时,每个实例的save()都会先执行MyModel.objects.count() >=5的判断,此时count值本身就是5,直接触发了ValidationError。
二、无需移除模型的save方法,只需调整判断逻辑
你可以通过判断实例是否存在主键(self.pk)来区分更新和创建操作,仅在新建对象时触发数量限制:
from django.core.exceptions import ValidationError class MyModel(models.Model): name = models.CharField(_('Name'), max_length=80, unique=True) ... def save(self, *args, **kwargs): # self.pk为空代表是新创建的实例,仅此时检查数量 if not self.pk: if MyModel.objects.count() >= 5: raise ValidationError("Can not have more than 5 MyModels!") super().save(*args, **kwargs)
修改后,编辑现有实例时不会触发数量验证,只有新增对象时才会检查总数是否超过5,完美适配表单集的批量编辑场景。
内容的提问来源于stack exchange,提问作者Pedro Silva
相关产品推荐
相关产品推荐

