だから私は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が一意のフィールドを評価しているようです(これは理にかなっています)。検証の前に、これらのフィールドを計算するためにどの方法またはどのメソッドをオーバーライドする必要があるかを知る必要があります。
さらに、unique_together ミックスに 3 番目のフィールドを追加することに関心があります。満たされていない場合は、空のデフォルト値になります。これで問題が発生しないことを願っています。
また、ユーザーが製造元と部品番号のフィールドをタブアウトし、両方が空でない場合、一部の js がその製品が既に存在するかどうかを確認し、ボタンをクリックしてすぐに移動するオプションをユーザーに提供することも素晴らしいでしょう。残りのデータを入力して時間を無駄にする前に、そのレコードが既に存在することを確認します。これは、深刻なハッキングがなければ、管理インターフェイスの領域外にあると思います。これを何らかの方法で管理インターフェイスと統合する方法はありますか? 今まで私にとってはうまくいっています...