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が一意のフィールドを評価しているようです(これは理にかなっています)。検証の前に、これらのフィールドを計算するためにどの方法またはどのメソッドをオーバーライドする必要があるかを知る必要があります。

さらに、unique_together ミックスに 3 番目のフィールドを追加することに関心があります。満たされていない場合は、空のデフォルト値になります。これで問題が発生しないことを願っています。

また、ユーザーが製造元と部品番号のフィールドをタブアウトし、両方が空でない場合、一部の js がその製品が既に存在するかどうかを確認し、ボタンをクリックしてすぐに移動するオプションをユーザーに提供することも素晴らしいでしょう。残りのデータを入力して時間を無駄にする前に、そのレコードが既に存在することを確認します。これは、深刻なハッキングがなければ、管理インターフェイスの領域外にあると思います。これを何らかの方法で管理インターフェイスと統合する方法はありますか? 今まで私にとってはうまくいっています...

4

2 に答える 2

4

私はそれを考え出した。興味のある他の人のために答えを投稿しています。これは実際、モデルに実装するのは非常に簡単でした。必要なのは、モデルの clean() メソッドを実装 (オーバーライド?) することだけです。このメソッドでは、特別なフィールドを計算して設定し、その後必ず self.validate_unique() を呼び出します。魔法のように動作します!例外を発生させる必要はありません。フォームはエラーを完全に一番上に表示します。その時点でコードまたは django が例外をスローできないため、save メソッドでこれを実行しても機能しません。コードは次のとおりです。

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 に答える