こんにちは、私は 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()