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

