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