3

こんにちは、私は django を初めて使用し、モデルにカスタム フィールドを使用することに初めて取り組みました。常に小文字で保存したい Char フィールドがあるため、次のようにカスタム フィールドとして実装しました (別のスタック オーバーフローの投稿から学びました)。

from django.db import models
from django.db.models.fields import CharField

class LowercaseCharField(CharField):
    def pre_save(self, model_instance, add):
        current_value = getattr(model_instance, self.attname)
        setattr(model_instance, self.attname, current_value.lower())
        return getattr(model_instance, self.attname)


class Item(models.Model):
    name = LowercaseCharField(max_length=50, unique=True)

    def __str__(self):
        return self.name

これを管理者でテストしたところ、実際にフィールド エントリは保存される前に正しく小文字に変換されます。残念ながら、一意性制約をテストしたところ、管理者は整合性エラーを適切に処理していませんでした。最初から大文字と小文字が完全に一致する場合、私のようにクリーンなエラーが発生する代わりに:

ここに画像の説明を入力

醜いエラーページが表示されます:

ここに画像の説明を入力

一意の制約が適切なエラーをトリガーするのに十分な「早い段階」でキャッチされるようにカスタム フィールドを設定するにはどうすればよいですか。

(注:現在、データベースにsqlite3を使用しています)

更新:誰かが興味を持っている場合は、これが私のために働いた修正されたコードです:

class LowercaseCharField(CharField):
    def get_db_prep_value(self, value, connection, prepared=False):
         return value.lower()
4

1 に答える 1