Django中MOC实例聚合状态(通过/驳回)的实现方案咨询
实现MOC聚合审批状态逻辑
1. 在Moc模型中添加聚合状态计算方法
直接在Moc模型里实现实例方法,实时计算当前聚合状态,模板和视图可直接调用:
from django.db import models # 状态常量定义 STATUS_CHOICES = [ ('PENDING', '待审批'), ('VERIFIED', '已通过'), ('REJECTED', '已驳回'), ] class Moc(models.Model): # 现有字段保留... def get_aggregate_status(self): # 获取当前Moc关联的所有签署记录 sign_offs = self.verifiersignoff_set.all() # 存在驳回记录直接返回REJECTED if sign_offs.filter(status='REJECTED').exists(): return 'REJECTED' # 3位验证者全部通过则返回VERIFIED if sign_offs.filter(status='VERIFIED').count() == 3: return 'VERIFIED' # 其余情况返回待审批 return 'PENDING'
2. 视图层传递Moc实例到模板
视图无需额外处理状态计算,正常将Moc实例传入上下文即可:
def moc_detail(request, moc_id): moc = Moc.objects.get(id=moc_id) # 其他业务逻辑... return render(request, 'moc_detail.html', {'moc': moc})
3. 模板中展示聚合状态
直接调用Moc实例的方法,结合条件渲染展示对应状态:
<div class="moc-aggregate-status"> {% if moc.get_aggregate_status == 'VERIFIED' %} <span class="status-tag verified">*全部验证通过*</span> {% elif moc.get_aggregate_status == 'REJECTED' %} <span class="status-tag rejected">*已被驳回*</span> {% else %} <span class="status-tag pending">*待审批*</span> {% endif %} </div> <!-- 保留原有单个验证者状态展示 --> <div class="individual-verifier-status"> {% for sign_off in moc.verifiersignoff_set.all %} <p>{{ sign_off.verifier.name }}: {{ sign_off.get_status_display }}</p> {% endfor %} </div>
补充优化点
- 若后续验证者数量可能变动,可把硬编码的
3替换为self.verifier_set.count(),提升扩展性 - 该方法为实时计算,无需额外存储状态字段,避免数据不一致问题
内容的提问来源于stack exchange,提问作者SS_SS
相关产品推荐
相关产品推荐

