0


Django で単純なモデルを定義しました。

class Student(models.Model):
    s_name = models.CharField(max_length=32)
    s_gpa = models.FloatField(min=0.0, max=5.0, default=5.0)
    s_year = models.IntegerField(min=1, max=10, default=1)
    s_registered = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return self.username

    def modify(self, **kwargs):
        if valid(self, kwargs):
            for k,v in kwargs.iteritems():
                setattr(self, k, v)
            self.save()

def valid(s, kwargs):
    # For all k,v pairs in kwargs
    # (1) Checks if k is one of the attributes of s. Returns False if fails.
    # (2) Checks if v fits the format defined for attribute k of s.
    # Returns False if fails.
    # Returns True if reaches this point.

私は有効な関数を書いています。これは、コメントに詳述されているコマンドを実行したいと考えています。(1)
の 場合、私は使用します

if k not in s.__dict__: return False

(2)の助けが必要です。
つまり、値が属性 (Django モデル フィールド) に定義された形式に適合するかどうかを確認するにはどうすればよいですか?

例: valid(s_name=True) と valid(s_name=33*'a') は両方とも False を返す必要があります。

注: フォームを使用せずにこの検証を解決しようとしています。

4

2 に答える 2

1

あなたvalidmodify関数の両方をおそらくメソッドに置き換える必要がありますclean

モデルの検証に関するドキュメントをご覧ください

更新 1

おそらく、有効なメソッドを完全に削除して、self.clean_feilds()代わりに単に呼び出すことができます。それはフィールドを検証します-

def modify(self, **kwargs):
    try:
        self.clean_fields()
        for k,v in kwargs.iteritems():
            setattr(self, k, v)
        self.save()
    except:
        pass

更新 2

あなたのコメントから、自分で検証を呼び出す必要はまったくないように思えます。変更が無効な場合は、呼び出しsaveてから、スローされたものをキャッチしてください。ValidationError

def modify(self, **kwargs):
    try:
        for k,v in kwargs.iteritems():
            setattr(self, k, v)
        self.save()
    except ValidationError:
        #... do something?

多くの Python プログラマーが if valid / then よりも try / except パターンを好むことは注目に値します。これは、「許可よりも許しを求めるほうがよい」原則として知られています (とりわけ、競合状態に対する保護を提供します - この場合はおそらく関係ありません)。

于 2013-02-25T18:04:33.450 に答える
0

s必要に応じてまたはを使用selfします。

def valid(self, kwargs):
    for k, v in kwargs:
        old_v = self.__dict__[k]
        self.__dict__[k] = v
        try:
            self.save()
            self.__dict__[k] = old_v
            self.save()
        except:
            return False

        return True

実際の 'self.save()' の失敗よりも、テストを実行するためのより直接的な方法がある可能性がありますが、開始するのに適した場所です。

または:

field_list = ['s_name', 's_gpa', 's_year', 's_registered']
def valid(self, kwargs):
    for k, v in kwargs:
        exclude_list = [f for f in field_list if f != k]
        try:
            self.clean_fields(exclude=exclude_list)
        except ValidationError:
            return False

        return True

リスト内包表記を使用して、行を削除し、exclude_list行を次のように変更self.clean_fieldsします。

self.clean_fields(exclude=[f for f in field_list if f != k])
于 2013-02-25T18:05:17.303 に答える