LINUX.ORG.RU

Django: свои ограничения на поле модели?


0

0

Дорогой ЛОР,

Я нуб и быдло в Django, но хочу его осилить. И возникла задача сделать
в модели валидацию поля хитрее choices. В модели ниже url_pattern это
строка для sprintf^W оператора %, причем оно должно мочь иметь только
строго ограниченный набор пллейсхолдеров (скажем, %(title) и %(type),
но не более того).

  class StorageServer(models.Model):
      name = models.CharField(_('Server name'), maxlength=32)
      url_pattern = models.CharField(_("URL template"), maxlength=255)

И, вот, я не особо понимаю где это делается. В формах (FilePathList
устроен, как я понял, именно так, через get_manipulator_field_objs оно
возвращает поле формы и вся проверка идет только там, но это же
некошерно) или все-таки где-то в модели можно проверить?

Итогом хочется, чтобы любое foo.url_pattern = "http://foo.tld/%s/"
в коде бросало исключение (т.к. "%s" там быть не положено).

http://www.djangoproject.com/documentation/custom_model_fields/ читал,
ничего похожего на то, что я хочу не нашел, разве что в
get_db_prep_save() бросить исключение... Но выглядит как-то
неправильно, т.е. это уже при записи в базу, а не присваивании
и обработке.

Собственно, в какую сторону курить?


P.S. Такая штука необходима и обойтись по-другому не получится. Есть
ряд серверов с разными схемами адресации. Для одного будет, скажем,
"http://foo.tld/bar/%(title)/", для другого "ftp://baz.tld/%(slug)/".
Узнавать о том, что я опечатался, хочу сразу, а не когда потом поймаю
исключение при подстановке в паттерн.
anonymous
Ответ на: комментарий от friday

> Можно вручную проверять, питоном или триггерами

Некошерно. Хочется именно The Right Way знать как надо делать.

anonymous
()

Телепаты в отпуске, напишите подробнее откуда приходят данные, в каком месте (ваш view, contrib.admin или еще где-то) могут происходить изменения?

Почему не делать проверку до присваивания foo.url_pattern = validate("http://foo.tld/%s/";) ?

В любом случае пересмотрите логику работы приложения, вы что-то делаете не так.

anonymous
()
Ответ на: комментарий от anonymous

Ага, т.е. валидация на уровне моделей это не Django-way, просто? Я в Django толком не вник, просто ищу фреймворк, который будет максимально соответствовать идеологии того, как я хочу писать код. И пока Django из-за своего слегка «сдвинутого» MVT вместо MVC мне больше всего симпатизирует.

Обычное применение я думал как форму в своем view. Прицепить свое поле со своим валидатором я, разумеется, могу, но мне кажется это несколько неправильным.

В худшем же случае я полусонный вваливаюсь через manage.py в консоль (как самый удобный для меня, при наличии хорошего языка общения, вид интерфейса), там брякаю нужное foo.url_pattern = "http://foo.tld/bar/%titel/"; и, довольный, не заметив опечатку отключаюсь. Да, само виновато, но сильно хочется поиметь исключение вот именно здесь, как если бы я вдруг в FloatField начал строками писать. Предупреждая возражения — нет, это отличается от того, что я полезу UPDATE'ами прямо в БД и там насвинячу, я (в моем понимании) работаю не с хранилищем, а с объектом-абстракцией, который мне предоставляет ORM.

Вроде как через свойства (getters/setters), похоже, стоит идти.

anonymous
()
Ответ на: комментарий от anonymous

А, да, никакого конкретного случая нет (есть тестовый проект-полигон класса «hello, world», который метается туда-сюда) это был больше общий вопрос по идеологии «как вообще делаются такого рода вещи». Просто мне показалось, что, раз модель занимается вопросами типов данных (что более чем логично), и лезет дальше базовых типов SQL (всякие ImageField, IPAddress etc.), то как-то должны быть и проверки что я туда не чушь пихаю.

Если нет конкретного подхода к этому со стороны моделей, или практика просто заканчивается на валидаторах форм, а в модели данные не проверяются — так и скажите, пожалуйста, это будет более чем достаточно.

Спасибо.

anonymous
()
Ответ на: комментарий от anonymous

Вообще при создании поля в модели можно указать validators_list, но это довольная темная область, ее вроде переписывать собирались, как-то пробовал что-то не работало. Попробуйте, возможно работает. Но подозреваю, что exception будет брошен в save() методе модели, а не в момент присваивания.

Также можно переопределить метод save() и самому там проверять явным образом.

Если надо именно в момент присваивания, то действительно надо смотреть в сторону декораторов и всяких __set__ методов.

Еще можно модели дать метод set_my_variable() в котором проверять все что надо и присваивать значение атрибуту - в дальнейшем пользоваться везде только им.

Еще раз повторюсь, попробуйте пересмотреть логику приложения, может быть все можно реализовать проще чем через задание поля dict.

anonymous
()
Ответ на: комментарий от anonymous

Большое спасибо, похоже что properties это самое оно что и хотелось.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.