1

2 人の子供に継承される抽象モデルがあります。子では、バリデーターを設定しています。コードを実行すると、両方の子がバリデータを持っていることがわかります。

擬似コードは次のとおりです。

class myAbstract(models.Model):
    Intro         = models.TextField(blank=True, null=True, )

    class Meta:
        abstract = True

class child1(myAbstract):
    class Meta:
         verbose_name = 'child 1'

class child2(myAbstract):
    def __init__(self, *args, **kwargs):
        super(child2, self).__init__(*args, **kwargs)

        intro = self._meta.get_field('Intro')
        intro.validators.append(MaxLengthValidator(60))

     class Meta:
         verbose_name = 'child 2'

管理者で、child1 を追加してから child2 を追加すると、バリデーターが child2 に対して開始され、文字数が制限されます。child2 から始めると、child2 はバリデーターを取得しません。

これは予想される動作ですか?もしあれば、これをコーディングするための提案された方法は何ですか? Intro を子クラスに移動することを考えました。

解決済み: Alasdair が指摘したように、バリデータはクラス変数であるため、これは予期される動作です。

Intro フィールドを子に移動しようとしましたが、うまくいきませんでした。私はこのソリューションを使用しました:モデルフォームにforms.CharFieldを設定する
https://stackoverflow.com/a/3209550/757955 。

4

2 に答える 2

0

私は本当にこの動作を期待していませんでしたが、モデルのバックグラウンドで多くの魔法の出来事が起こっています. 私は2つの解決策を見ます:

  1. クラスではなく、インスタンスを変更します。_meta はクラス変数であるため、_meta.get_field はクラス属性を返します。私はむしろそのようにインスタンスフィールドを操作しようとします

    def init (...): self.intro.validators.append(MaxLengthValidator(60))

  2. 1 が機能しない場合、または気に入らない場合は、モデルをそのままにしておきます。つまり、バリデータを追加せずに、モデルに使用するフォームにバリデータを追加します。そこでは、より柔軟性があり、やりたいことができます。

于 2012-08-21T21:12:13.163 に答える
0

validatorsモデル インスタンスごとに設定されません。を追加すると、親クラスMaxLengthValidatorのフィールドが変更されます。intro

これを回避する簡単な方法はないと思います。clean()子モデルごとにメソッドを記述し、そこで検証を実行できます。introただし、フィールドを子クラスに移動するのがおそらく最良の選択肢だと思います。

于 2012-08-21T21:12:21.920 に答える