You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:01:07