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

Django模型中自动生成user+label的MD5值填充unique_key字段

嘿,这事儿好办!要让unique_key自动填充成user和label拼接后的MD5值,我给你两种实用的方法,看你偏好哪种:

方法一:重写模型的save()方法(最直接)

这种方式把逻辑直接写在模型类里,直观又好维护。先给你完整的代码:

import hashlib
from django.db import models

class Labels(models.Model):
    user = models.CharField(max_length=200)
    label = models.CharField(max_length=200)
    live = models.CharField(max_length=1)
    # 这里设置blank=True(自动填充不需要手动输入)、editable=False(后台禁止手动修改)
    unique_key = models.CharField(max_length=200, blank=True, editable=False)

    def __str__(self):
        return '%s / %s' % (self.user, self.label)

    def save(self, *args, **kwargs):
        # 拼接user和label字符串
        concat_content = f"{self.user}{self.label}"
        # 计算MD5哈希值,记得先把字符串转成bytes格式
        self.unique_key = hashlib.md5(concat_content.encode('utf-8')).hexdigest()
        # 调用父类的save方法完成最终保存
        super().save(*args, **kwargs)

小技巧:控制生成时机

如果你希望只有在创建新标签时生成unique_key,后续更新用户或标签时不改变它,可以给save方法加个判断:

def save(self, *args, **kwargs):
    # 只有当对象是新创建(还没主键)且unique_key为空时才生成
    if not self.pk and not self.unique_key:
        concat_content = f"{self.user}{self.label}"
        self.unique_key = hashlib.md5(concat_content.encode('utf-8')).hexdigest()
    super().save(*args, **kwargs)

方法二:使用Django的pre_save信号(解耦逻辑)

如果不想把生成逻辑和模型绑在一起,或者多个模型都需要类似的哈希生成逻辑,用信号就很合适。代码如下:

import hashlib
from django.db import models
from django.db.models.signals import pre_save
from django.dispatch import receiver

class Labels(models.Model):
    user = models.CharField(max_length=200)
    label = models.CharField(max_length=200)
    live = models.CharField(max_length=1)
    unique_key = models.CharField(max_length=200, blank=True, editable=False)

    def __str__(self):
        return '%s / %s' % (self.user, self.label)

# 定义信号接收器,在Labels保存前触发
@receiver(pre_save, sender=Labels)
def auto_generate_unique_key(sender, instance, **kwargs):
    concat_content = f"{instance.user}{instance.label}"
    instance.unique_key = hashlib.md5(concat_content.encode('utf-8')).hexdigest()

同样,你也可以在接收器里加判断,控制什么时候生成新的unique_key,逻辑和方法一一样。

最后提一句:MD5虽然满足你的需求,但如果是涉及敏感数据的场景,建议用SHA-256这类更安全的哈希算法,替换起来也很简单,把hashlib.md5改成hashlib.sha256就行~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:48:50