Django中Annotate统计Gallery模型图片数后如何与整数5比较
Django实现单公司最多5张图片上传限制的方案
你现有的查询逻辑是错误的,Gallery.objects.values('company').annotate(Count('image')).count() 返回的是有上传图片记录的公司总数量,不是单个公司的已上传图片数,自然无法和阈值5做比较。
正确校验逻辑
在模型的clean方法中统计当前关联公司的已上传图片数,注意要排除当前正在保存的实例,避免更新已有图片时误将自身计入数量导致报错。
首先导入Django内置的校验异常:
from django.core.exceptions import ValidationError
然后修改Gallery模型的clean方法:
def clean(self): super().clean() # 统计当前公司除当前实例外的已存图片数量 current_company_image_count = Gallery.objects.filter( company=self.company ).exclude(pk=self.pk).count() if current_company_image_count >= 5: raise ValidationError("每家公司最多只能上传5张图片")
注意事项
- 如果你通过
ModelForm提交数据,表单会自动调用模型的clean方法完成校验,无需额外处理 - 如果你直接调用模型的
save()方法保存数据,需要先手动调用full_clean()方法触发校验,否则限制逻辑不会生效:gallery_obj = Gallery(company=xxx, image=xxx) gallery_obj.full_clean() # 触发校验,不通过会直接抛出ValidationError gallery_obj.save()
内容的提问来源于stack exchange,提问作者lord stock
相关产品推荐
相关产品推荐

