1

商品ID変換アプリを作成しています。2 つの ID スタイルを表す 2 つのモデルがあります。

class Id1(models.Model):
    number = models.CharField(max_length=10)
    converted = models.CharField(max_length=13)
    status = models.CharField(max_length=5) # validation status
    error = models.CharField(max_length=10) # error message

    def __unicode__(self):
        return self.number

class Id2(models.Model):
    number = models.CharField(max_length=13)
    converted = models.CharField(max_length=10)
    status = models.CharField(max_length=5) # validation status
    error = models.CharField(max_length=10) # error message

    def __unicode__(self):
        return self.number

次の 2 つの理由から、Django モデルに組み込みたいサードパーティの Python (非 Django) モジュールがあります。

  1. 必要な変換機能をすでに提供しています
  2. 変換を行う際に OO アプローチを使用したい - 関連するデータとそのインスタンスのメソッドをカプセル化するクラス (Id1 など) のインスタンスを作成します。

サードパーティ モジュールには、それぞれいくつかのフィールドとメソッドを持つ次のクラスがあります。

  • クラスID(オブジェクト)
  • クラス Id1(ID)
  • クラス Id2(ID)

...そして、クラスメソッドが呼び出す次のトップレベル関数:

  • デフォルト検証
  • デフコンバート
  • def calculate_checksum
  • デフクレンズ

ただし、データベース内のサードパーティ モジュールの属性は必要ありません。各データベース テーブルには、Django モデル フィールド (数値および変換済み) のみを含める必要があります。

これはどのように達成できますか?これが不可能な場合、この問題に取り組む別の方法は何ですか? ビューにロジックを委任しますか?

[編集]モジュールメソッドを使用して、「変換済み」、「ステータス」、「エラー」などのフィールドの一部を初期化したいことを追加するのを忘れていました。これを行う方法はありますか?

4

1 に答える 1

0

まあ、いくつかのアプローチがあるかもしれません:

まず、モジュールをインポートして、モデル オブジェクト内のカスタム メソッド内に関連するロジックを次のようにカプセル化できます。

import module
class Id1(models.Model):

    ...

    def custom_validate_method(self):
        # instantiate modules classes needed
        # write the logic needed

Id1次に、クラスの任意のインスタンスでこのメソッドを呼び出すことができます。または、次save()のようにオブジェクトを永続化しようとするときに、メソッドをオーバーライドして追加のロジックを実行することもできます。

    def custom_validate_method(self):
        # instantiate modules classes needed
        # write the logic needed

    def save(self, *args, **kwargs):
        # perform logic (maybe call custom_validate_method)
        return super(Id1, self).save(*args, **kwargs)

これを実現するために多重継承を使用することもできますが、注意してください。多重継承は名前の競合を引き起こす可能性があります。次のようになります。

import module
class Id1(models.Model, module.Class):
number = models.CharField(max_length=10)
converted = models.CharField(max_length=13)

def __unicode__(self):
    return self.number

Id1 クラスで継承されたモジュールで必要なクラスの機能が用意されています。

それが役に立てば幸い。

于 2013-05-02T13:04:15.883 に答える