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

Django的Article模型barcode更新重复生成,如何仅首次创建时生成一次?

解决方案

你当前每次更新对象都会重新生成条形码,是因为save方法中的条形码生成逻辑没有区分「首次新增」和「后续更新」场景,每次调用save都会执行生成逻辑。仅需新增判断实例是否为首次创建的逻辑即可解决,Django中未持久化到数据库的新实例主键pk为None,可以用这个特征做判断。

修改后的完整save方法代码如下:

def save(self,*args, **kwargs):
    # 仅首次创建对象时生成条形码
    if not self.pk:
        EAN = barcode.get_barcode_class('upc')
        r = self.categorie.id + self.user.id
        rr = self.categorie.id + self.date_entree.day + self.prix_achat
        ean = EAN(str(self.categorie.id)+str(self.user.id)+str(r)+str(self.date_entree.year)+str(self.date_entree.month)+str(self.date_entree.day)+'34', writer=ImageWriter())
        buffer = BytesIO()
        ean.write(buffer)
        self.numero = ean.__str__()
        # 这里去掉了原代码多余的大括号,避免文件名携带{}符号
        self.barcode.save(str(self.nom)+'.png', File(buffer), save=False)
    return super().save(*args, **kwargs)

补充说明

  • 如果你的业务场景允许创建时手动传入barcode值,可以把判断条件调整为if not self.pk and not self.barcode,避免自动生成逻辑覆盖手动上传的条形码
  • UPC码规范要求输入必须为11位数字(会自动补最后1位校验位),拼接的字符串长度需要符合要求,否则会生成失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:36:03