Куда должна идти проверка полей модели в django?
Я мог бы назвать как минимум два возможных варианта: в перегруженном методе .save () модели или в методе .to_python () подкласса models.Field (очевидно, чтобы это работало, вы должны написать пользовательские поля).
Возможные варианты использования:
- когда абсолютно необходимо убедиться, что пустая строка не записывается в базу данных (пусто = аргумент False ключевое слово здесь не работает, он только для проверки формы)
- когда необходимо убедиться, что аргумент ключевого слова "выборы" соблюдается на уровне БД, а не только в интерфейсе администратора (эмуляция типа данных enum)
В моделях также есть атрибут уровня класса empty_strings_allowed
. Определение базового класса поля и производные классы успешно переопределяют его, однако, похоже, он не оказывает никакого влияния на уровень базы данных, то есть я все еще могу создать модель с пустыми строковыми полями и сохранить ее в базе данных. Чего я хочу избежать (да, это необходимо).
Возможные реализации
на уровне поля:
class CustomField(models.CharField):
__metaclass__ = models.SubfieldBase
def to_python(self, value):
if not value:
raise IntegrityError(_('Empty string not allowed'))
return models.CharField.to_python(self, value)
на уровне модели:
class MyModel(models.Model)
FIELD1_CHOICES = ['foo', 'bar', 'baz']
field1 = models.CharField(max_length=255,
choices=[(item,item) for item in FIELD1_CHOICES])
def save(self, force_insert=False, force_update=False):
if self.field1 not in MyModel.FIELD1_CHOICES:
raise IntegrityError(_('Invalid value of field1'))
# this can, of course, be made more generic
models.Model.save(self, force_insert, force_update)
Возможно, я что-то упустил, и это можно сделать проще (и чище)?