Как правильно сохранять инлайн модель в админке, если id модели-родителя еще не сохраненно в бд?

Доброго времи суток, сообщество!
Intro: являюсь новообращенным в линукс и питон. На данный момент практикуюсь пистаь на джанго. Решил отойти от написания бложика и написать "местный air bnb". Суть проста: админ заводит новую квартиру, с описанием, указанием координат и фотографиями интрерьера. Интерьер "подключен" как инлайн в квартире (многие-к-одному). Так же в интерьере есть фото интерьера, с отношением так же многие-к-одному.
Если сначала сохранить flat, потом создать и сохранить interior, а уже потом зааплоадить и сохранить фото, то все нормально
Проблема: Но если же попробовать создать flat и interior (не сохраняя) и загрузить фото и сохранить уже в конце, то система сначала попытается сохранить фото (в моем случае основанное на id квартиры и интерьера, котороые еще не записаны в БД), то в путь будет сформирован вида FlatNone/InteriorNone/...
Варианты встреченные на просторах:
1)по другому задавать названия файлов и не раскладывать по папкам. Перфекционист во мне сопротивляется такому решению.
2)Использовать presave. А именно до момента "стандартного" сохранения сохранить id квартиры, а потом id интерьера. Но получается, что в момоент "стандартного" сохранения будет еще одно обращения к БД. Тот же самый перфекционист бастует. Вот тут интересно услышать мнение сообщества, возможно я переусложняю.
3)Возможен еще один вариант: переписать метод сохранения, что бы сначала сохранялась модель flat, потом interior, а потом фото. Но на этой мысли у меня начианют дрожать колени и хочется посмотреть чей-нибудь пример и услышать совет. Самому вряд ли получится сделать нормальное переопределение.

Да, и извините, что код в репе выглядит не очень, иногда не удердиваюсь и коммичу так как есть, потому что "заработало!" ;)
С уважением.

  • Вопрос задан
  • 2745 просмотров
Пригласить эксперта
Ответы на вопрос 3

Столкнулся однажды с той же проблемой. Но из лени решил последовать принципу Sorl Thumbnail, который формирует пути так:

/your_media_folder/b1/08/b108d1217ae0ec3d38c1e6c174c032ce.jpg


Иными словами, каждая картинка получает в качестве имени случайный UUID и раскладывается по папкам из первых его символов. Получаем равномерную раскладку по папкам, что избавляет от беспокойства о возможном торможении файловой системы при большом количестве файлов в папке. Избавляемся от необходимости нормализовать имена файлов (а если символы кириллические в имени попадутся? все ли компоненты системы отнесутся к этому благосклонно?). Взамен же теряем соответствие между структурой файловой системы и структурой моделей Django. ПМСМ, это несущественно; может быть, у Вас ситуация иная и такой способ не подойдёт.

Ответ написан
nekt
@nekt
программист

Если хочется побаловать перфекциониста, то однозначно третий вариант. На практике же все используют вариант, описанный Altaisoft-ом и не парятся.

Ответ написан
Комментировать
McGrog
@McGrog Автор вопроса
Спасибо за ответы и советы.
2 Altaisoft:
Да, я пробовал делать нечто похожее. UID выладвал результатом хэшфункции от времени + еще что-нибудь. И имена номрмализовал, никакой кириллицы и пробелов. Но это не удобно для
1) дебага - посмотреть, что сдалал обработчик фото или куда суется JS за фото.
2) для гипотетической поддержки и масштабируемости. Друг который занимаетя разработкой iOS в моменты диспутов поучает меня что надо думать о своих последователях - они могут шарить ся по sftp, смотреть код страницы, делать что-либо еще и сильно удивляться. К тому же это как то не красиво что фреймворк может генрить урлы на страницы в человекочитаемом формате, а вот на медиа файлах разраб сплоховал.
3)для админов/манегеров сайта так же подобная иерархия будет шевелить волосы на одном месте. Но с ними проще, если очень постараться и допилить админку. С чем у меня пока не лады)

2 nekt:
Очень хочется. но страшно. Даже не знаю как подступиться. У вас случаем не завалялось собственной реализации подобных веще? Хорошо подумайте перед ответом, ведь тогда не отстану с расспросами)

На выходных еще раз погуглю и если кто-нибудь отпишется здесь о возможност помочь, предлагаю разобрать какой-нибудь "just working example". Просто на stackoverflow прям таких же вопросов не поднималось.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы