4

setter入力を検証し、値が無効な場合はすぐにエラーを発生させるために、Django モデル フィールドの関数を定義したいと考えています。

またはで検証を行うことsave()pre_save()は、私が制御できないため、私の問題の実行可能な解決策ではないと思います。

また、フィールドをプロパティに変更してプレーンを使用することはfield.getter、フィールドで壊れるなどのfield.setter理由で実行できません。さらに、マネージャーに変更して上書きした場合でも、スキームの変更が必要になります。.filter().exclude()field_field

それで、私はオーバーライドを余儀なくされています__setattr__か、それともこれを行うためのより良い方法はありますか?

4

3 に答える 3

2

Field をサブクラス化し、オーバーライドすることができますto_python

class UnforgivingCharField(CharField):
    __metaclass__ = models.SubfieldBase

    def to_python(self, value):
        if not passes_my_test(value):
            raise Hell()
        return super(UnforgivingCharField, self).to_python(value)

これは、値が設定されているときget_prep_valueや などで使用されるため、フィルタリング時に無効な値をキャッチします。

詳細はこちら。リンクされたセクションの下部にある行に注意してくださいto_python。これは、呼び出されることを示しています。

編集: たまたまSouthを使用している場合に備えて、カスタム モデル フィールドを実装する場合は、いくつかのイントロスペクション ルールを追加する必要があります。

于 2012-09-28T17:21:09.193 に答える
0

このdjangoチケットを参照してください:

https://code.djangoproject.com/ticket/3148

また、ここで議論を参照してください:

Djangoモデルフィールドゲッター/セッター

そしてこのブログ投稿:

http://www.b-list.org/weblog/2006/aug/18/django-tips-using-properties-models-and-managers/

また、自分に代わって翻訳するカスタムマネージャーを使用したり、フィールドにfilter kwargs使用したり、独自のマネージャーを作成したりするオプションがあることにも注意してください。_name@name.setter @name.getter

于 2012-09-28T12:52:51.093 に答える
0

適切な機能を提供し、正しいエラーを発生させる関数を定義できますか?

class YourModel(models.Model):

   def add_your_value(self, value):
       # check if value is correct
       # raise exception if it isn't
       # set correct property
于 2012-09-28T14:37:49.923 に答える