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
相关产品推荐
相关产品推荐

