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

如何在Django中为员工生成带分支前缀的自定义唯一ID

实现Django模型中按分支生成唯一员工ID的方案

前提准备

首先需要确保你的Branch模型包含一个分支编码字段(比如branch_code,存储BDO、JKT这类标识),如果没有的话,先修改Branch模型并完成迁移:

class Branch(models.Model):
    branch_code = models.CharField(max_length=3, unique=True, verbose_name="分支编码")
    # 保留你的其他原有字段,如分支名称、地址等
    def __str__(self):
        return self.branch_code

修改Karyawan模型实现自动生成ID

通过重写Karyawan模型的save方法,实现自动按分支生成格式为[分支编码]+[三位序号]的唯一id_karyawan:

from django.db import models
from autoslug import AutoSlugField

class Karyawan(models.Model):
    id_karyawan = models.CharField(max_length=10, blank=True, null=True, unique=True)
    nama_karyawan = models.CharField(max_length=50)
    jabatan = models.CharField(max_length=15)
    branch_id = models.ForeignKey(Branch, on_delete=models.CASCADE, null=True)
    agen_id = models.ForeignKey(Agen, on_delete=models.CASCADE, null=True)
    salary = models.IntegerField()
    alamat_karyawan = models.TextField()
    tanggal_masuk = models.DateField(null=True)
    kota_karyawan = models.CharField(max_length=30, null=True)
    ttl_karyawan = models.DateField(null=True)
    tanggal_resign = models.DateField(null=True, blank=True)
    no_hp_karyawan = models.CharField(max_length=15)
    slug_karyawan = AutoSlugField(populate_from='id_karyawan')

    def save(self, *args, **kwargs):
        # 仅当id_karyawan为空且关联了分支时才自动生成
        if not self.id_karyawan and self.branch_id:
            branch_code = self.branch_id.branch_code
            # 统计当前分支下已有的员工数量
            current_count = Karyawan.objects.filter(branch_id=self.branch_id).count()
            # 生成三位格式的序号(不足补0)
            sequence = str(current_count + 1).zfill(3)
            self.id_karyawan = f"{branch_code}{sequence}"

            # 处理并发冲突:如果生成的ID已存在,循环递增直到找到可用ID
            while Karyawan.objects.filter(id_karyawan=self.id_karyawan).exists():
                current_count += 1
                sequence = str(current_count + 1).zfill(3)
                self.id_karyawan = f"{branch_code}{sequence}"
        
        # 分支为空的情况可按需处理,比如抛出异常或生成默认ID
        elif not self.id_karyawan and not self.branch_id:
            raise ValueError("员工必须关联一个分支才能生成ID")
            # 也可以生成默认标识:
            # current_count = Karyawan.objects.filter(branch_id__isnull=True).count()
            # self.id_karyawan = f"UNK{str(current_count + 1).zfill(3)}"

        super().save(*args, **kwargs)

关键说明

  1. 唯一性保障:给id_karyawan添加unique=True约束,同时通过循环检查避免并发场景下的重复ID生成问题。
  2. 格式控制:用zfill(3)确保序号始终为三位数字(如001、010),符合需求格式。
  3. 避免覆盖:仅当id_karyawan为空时才生成,更新员工信息时不会修改已有ID。

内容的提问来源于stack exchange,提问作者Yodi Alfariz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:15:18