gpt4 book ai didi

django - 在 Django 中,如何在进行任何验证之前计算或更新某些模型字段?

转载 作者:行者123 更新时间:2023-12-03 03:10:36 24 4
gpt4 key购买 nike

所以我是 Django 新手...

首先介绍一下我们现在如何做事的背景。我们有一个自定义的 php 系统,但我正在 django 中仅使用管理界面构建一个改进的库存管理系统。我们存储零件编号,并且重要的是我们不存储重复的零件编号。有时可以使用连字符、句点、空格等输入零件号。无论输入哪种格式,我们都需要确保不会添加重复的零件。在我们现有的非 django 系统中,我们使用正则表达式从字符串中删除除 a-zA-Z0-9 之外的任何内容。实际输入的零件号将被保留,并且清理后的零件号也会被保留到数据库中。然后,当有人添加新零件或什至搜索零件时,零件编号的此清理版本有助于避免这种歧义。我们对制造商名称执行相同的操作。

我在 django 中模拟这一点的方法是将part_number_clean 字段与part_number 字段一起添加到模型中。然后我重写了保存方法来计算干净的零件编号,如下所示(也是制造商):

def save(self, *args, **kwargs):
self.manufacturer_clean = re.sub(r'[^a-zA-Z0-9]', '', self.manufacturer).lower()
self.part_number_clean = re.sub(r'[^a-zA-Z0-9]', '', self.part_number).lower()
super(CatalogProduct, self).save(*args, **kwargs)

问题是,我需要唯一的部件号和制造商的组合:

class Meta:
unique_together = ('part_number_clean ', 'manufacturer_clean ')

当我尝试保存重复记录时,出现数据库完整性冲突。所以看起来 django 在调用 save 函数之前正在评估唯一字段(这是有道理的)。我只需要知道在任何验证之前应该如何或哪种方法来计算这些字段。

此外,我有兴趣向 unique_together 组合添加第三个字段,该字段可能会被填写,也可能不会被填写。如果未填充,它将只有一个空的默认值。我希望这不会引起任何问题。

如果当用户选择制造商和零件号字段并且两者都不为空时,一些 js 会查看该产品是否已经存在,并为用户提供单击按钮和的选项,那就太好了在他们浪费时间填写其余数据却发现它已经存在之前,他们会被迅速带到该记录。我猜这超出了管理界面的范围,没有严重的黑客攻击。有什么办法可以将其与管理界面集成吗?到目前为止,它对我来说非常有用......

最佳答案

我明白了。我正在为其他好奇的人发布答案。这实际上在模型中实现起来非常简单。需要做的就是实现(覆盖?)模型的 clean() 方法。在该方法中,我计算并设置特殊字段,然后一定要调用 self.validate_unique() 。奇迹般有效!无需引发任何异常,表单将完美地在顶部显示错误。在 save 方法中执行此操作将不起作用,因为此时您的代码或 django 无法抛出异常。这是代码:

class CatalogProduct(models.Model):
manufacturer = models.CharField(max_length=100)
manufacturer_clean = models.CharField('Manufacturer',max_length=100,blank=True,editable=False)
part_number = models.CharField(max_length=100)
part_number_clean = models.CharField('Part number',max_length=100,blank=True,editable=False)

def clean(self):
# Calculate manufacturer_clean and part_number_clean
self.manufacturer_clean = re.sub(r'[^a-zA-Z0-9]', '', self.manufacturer).lower()
self.part_number_clean = re.sub(r'[^a-zA-Z0-9]', '', self.part_number).lower()
self.validate_unique()

关于django - 在 Django 中,如何在进行任何验证之前计算或更新某些模型字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13649006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com