3

所以我是Django的新手......

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

我在 django 中模拟这一点的方法是将 part_number_clean 字段与 part_number 字段一起添加到模型中。然后我覆盖了 save 方法来计算干净的零件号,就像这样(制造商也是如此):

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 会查看该产品是否已经存在,并为用户提供单击按钮并被快速离开的选项,这也将是很棒的到那条记录,在他们浪费时间填写其余数据却发现它已经存在之前。我猜这超出了管理界面的范围,没有严重的黑客攻击。有没有办法以某种方式将它与管理界面集成?到目前为止,它对我来说非常有用......

4

2 回答 2

4

我想到了。我正在为其他好奇的人发布答案。这实际上在模型中实现起来非常简单。需要做的就是实现(覆盖?)模型的 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()
于 2012-12-01T00:23:27.607 回答
0

该模型仅负责描述数据以及如何在 Python 和数据库环境之间表示数据。正是因为这种原子角色,模型才不关心验证以及您刚刚进入并引入的内容。

你需要一个模型表格。它可以清除制造商和零件编号,并确保满足唯一性约束作为验证过程的一部分。

于 2012-11-30T16:32:17.333 回答