Ответы пользователя по тегу Django
  • Как мне правильно настроить TimedRotatingFileHandler?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Проблема тут вот в чем. Ротейтинг логов устроен так, что запись идёт в файл, а потом, когда наступает условие из конфига логгинга (время или размер), файл переименовывается с добавлением даты и времени, а запись идёт в новый чистый файл.
    В линуксе это не вызывает проблемы из-за более совершенной логики работы файловой системы, но вот у вас в винде случается, например, вот что:
    Вы запускаете два (или больше) инстанса джанго, они оба наперебой пишут в файл (если им удаётся), или второй инстанс пытается им завладеть (тут не уверен), а когда наступает время его переименовывать, оказывается, что оригинальный файл захвачен другим процессом.
    Вам стоит писать логи отдельно каждым инстансом в отдельные файлы. Например добавьте в формулу, по которой формируется имя лог-файла номер процесса.
    Либо не выкаблучивайтесь и пишите логи в stdout, не надо засовывать в сервис лишнюю логику. Пусть логи обрабатываются (фильтруются, ротируются) вне процесса.
    Ответ написан
  • TypeError: 'class Meta' got invalid attribute(s)?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    verbase_name -> verbose_name
    Ответ написан
    Комментировать
  • Почему не выводит посты на сайт Django?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    В комментариях ответили. В контекст передаётся коллекция статей в одной переменной, а в шаблоне итерируется другая.
    Ответ написан
    2 комментария
  • Почему при создании объекта поля содержащие время заполняются по разному?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Сделайте у модели вычисляемое свойство, которое будет сравнивать время с некоторой точностью. То есть таймдельта сравниваете с половиной секунды и все. При этом и в шаблонах у вас будет читабельно и лаконично, и в коде видно как вы определяете отредактирован ли пост.
    Ещё вы можете сделать дополнительное целочисленное поле с номером правки. По умолчанию оно будет ноль, а при каждой правке вы его будете инкрементировать. Тогда будет видно однозначно и без вот этих вот сравнений дат.
    Ответ написан
    Комментировать
  • Почему не запускается manage.py?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Просто погуглите как запустить проект джанго в пичарм на винде.
    Найдётся дофига статей, которые распишут вам всё по полочкам как виртуальное окружение сделать, как запускать удобнее, как отладку настроить...
    Ответ написан
    Комментировать
  • Как сделать пагинацию в Django для итерируемых в шаблоне объектов?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    В таких случаях обычно не разворачивают дерево начиная с какого-то уровня, иначе найти что-то полезное при наличии пагинации становится очень трудно. К примеру, у какого-нибудь Donald Duck'а будет две сотни подчиненных, а пагинация у вас ограничена пятьюдесятью. Показывая третью страницу вы не сможете отобразить всех сотрудников вверх по иерархии до корня дерева, поэтому не ясно будет кому они подчинены.

    Чтобы удобнее было отображать такого рода деревья и не делать при этом огромное количество лишних запросов на каждое поддерево, формируют для каждого узла синтетический идентификатор, который включает через разделитель идентификаторы всей цепочки его родителей.
    Упорядочивание узлов по такому идентификатору автоматически гарантирует их правильное расположение в дереве, а также позволит извлечь из одного идентификатора цепочку всех предков.
    Ответ написан
    Комментировать
  • Как добавить к основному продукту вспомогательный в django rest framework?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    А в чем проблема добавлять в заказ кофе отдельно, а топинг отдельно?
    На самом деле не зватает данных о том. как вы собираетесь это всё запрягать.
    Лучше сохранить плоскую простую структуру, а топинги просто указывать сразу после кофе.
    В одном заказе может быть несколько кофе с разными топингами.
    Вы можете сделать вместо ManyToMany модель произведения Заказе на Продукт в ручную:
    ПродуктВЗаказе(Заказ, Продукт, порядковый_индекс).

    Но вот я вижу у вас в Продукте какой-то volume. Это что значит, капучино у вас представлено в таблице продуктов всеми доступными объёмами? А топинги тоже определены объёмами?
    Если так, то Продукт у вас абстрактен, а в заказе он представлен таблицей ПродуктВЗаказе.

    Благодаря упорядоченности этой таблицы можно условиться, что если Продукт дополнительный, то он должен идти после продукта. в который его добавляют. Это чтобы по Заказу можно было однозначно приготовить кофе и не перепутать топинги.
    Минусов такого подхода несколько:
    - нужны методы перестановки элементов заказа, чтобы, например, заменить топинг к первому кофе из нескольких указанных в заказе.
    - если дополнитеьный продукт вроде топинга может оказаться и основным продуктом, то флаг его дополнительности придётся указывать в модели РодуктыВЗаказе. К примеру, можно заказать лимон и текилу по отдельности, а можно лимон в качестве добавки в чай. В этом случае нельзя указать в Продукте "Лимон" атрибут "дополнительный", ну или придется заводить отдельные Продукты для одного и того же лимона.

    Я бы не парился с признаком "дополнительности" у Продуктов, а вынес это флаг в таблицу ПродуктыВЗаказе и сделал бы методы перестановки элементов.
    Тогда заказ бы у меня был плоский, но выглядел как-то так:
    Капучино 300мл Арабика
    + Карамель
    + Корица
    + Шоколад
    Эспрессо 400мл Арабика
    + Коньяк

    Тогда, если девушка скажет: "ой. а можно мне ещё мятный сироп туда?"
    Бариста в приложении добавит "+ Мятный сироп" и перетащит его над Эсрессо.

    Плюсик будет определяться флагом в модели ПродуктыВЗаказе, а позиция целочисленным индексом в этой модели.
    Индексы можно проставлять с шагом, например, в 1000, а при перестановке тогда просто апдейтить только переставляемую запись устанавливая индекс посерединке между любыми двумя соседними.
    Ответ написан
    2 комментария
  • Уникальный id запуска Django?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    А где вы размещали этот код? Он выполняется дважды?
    Ваш проект весь в одном процессе стартует? Может быть поднимается несколько инстансов джанги.
    Если несколько инстансов, то такой идентификатор можно хранить только в БД, а перед стартом удалять его извне скриптом.
    Можете совсем перед запуском проекта вписаь в БД внешним скриптом новый UID и его же сохранить в переменных среды окружения процессов всех инстансов. Кстати, в таком случае и в БД можно не хранить тот уид. Просто перед запуском в баш-скрипте всем процессам переавать его и все.
    Ответ написан
  • Как использовать одновременно django и pyTelegrambotAPI?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Дополню соседний ответ для ясности.
    Не нужно городить монолит из совершенно разных сервисов.
    Если боту не обязательно реагировать на появление новых уведомлений в БД очень быстро, то можно сделать чтобы бот просто читал с некоторой периодичностьб ту же БД, что прописана в джанго. Можно построить индекс по таймштампу события и вычитывать все, что позднее прошлой проверки. Это будет и быстро и эффективно.
    Если реакция нужна очень быстрой, то лучше сделать очередь и применить pub\sub механизм. Бот подписывается на тред событий, а джанго пушит в него сообщения.
    Вполне можно в этом качестве использовать, например, rabbitmq.

    Если это просто односторонние уведомления, то, кстати, можно слать их прямо из кода на джанго через API. Но это если у бота нет интерактиности никакой с пользователем.
    Ответ написан
  • Формирование произвольных URL?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Джанго также отлично позволяет обрабатывать много урлов одним view. Можно просто зароутить все после слеша и парсить хвост урла как адресную цепочку.

    Как правило в таких способах представления адреса нужно стараться избегать отдельных запросов к БД по стране, городу, улице, дому. В идеале нужно доставать всю необходимую информацию за один запрос.
    Тут становится важным как устроена ваша БД. Обычно адресные элементы индентифицируются не по названию, ведь название, в данном случае, - это плохой идентификатор. Он с одной стороны громоздкий (Санкт-Петербург), а, с другой, есть проблемы с уникальностью для мелких населенных пунктов. А ещё топонимы чаще всего интенационализируются, то есть на разных языках они пишутся по-разному. Кроме того, адреса в рахных странах могут записываться по-разному, встречаются совершенно разные уровни административного деления, разные схемы подчинения административных единиц.
    К примеру, в РФ есть области (автономные области, края), районы, сёла, посёлки городского типа, микрорайоны, да и дома - это не рпосто нумерация, там есть дроби, литеры, корпуса...
    Каждй раз когда я вижу, что кто-то пытается такую сложныю предметную область формализовать в виде элементов URL, я срашиваю, а зачем это вообще нужно? URL - это не самая удобная штука для непосредственного ввода человеком. Особенно много вопросов вызовут топонимы с пробелами, дефисами, сокрашениями (С. Петербург, Питер). Для чего всё это? Не проще ли воспользоваться идентификатором адресной единицы от одного из адресных справочников вроде OKATO? Понятно что в разных странах эти справочники разные, но тут в любом случае надо делать разную логику.
    Я бы не заморачивался излишней читаемостью урлов в таком вот случае, а просто добавил бы префикс, однозначно указывающий на "домен" адресного пространства, и следом бы указывал идентификатор внутри этого адресного пространства. Вот смотрите сколько их бывает: https://classifikators.ru
    К примеру:
    /okato/70228870004
    Ответ написан
    Комментировать
  • Для каких проектов и задач в backend предпочтительнее Python с фреймворком Django?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вы немного путаете причины и следствия.
    Если ML и аналитику делают чаще всего н апитоне, это не значит, что на питоне делают чаще всего аналитику и ML. Просто для аналитики и ML в питоне очень много "батареек", он в этом направлении лидер. Но основное применение питона - это бэкенд. Джанго действительно очень популярна, и его только недавно стал перегонять FastAPI соблазняя своей асинхронностью.
    Прелесть и преимущество Джанги в его самодостаточности для многих направлений применения. Там и довольно элегантный ORM в коробке, и шаблонизатор, и, что часто очень важно, простя в использовании и мощная админка с системой атворизации и управления правами. Практически с голой джангой и за пол часика можно быстро набросать модель данных и развернуть MVP, причем совсем не придётся тратить время ни на авторизацию, ни на организацию всяких там систем миграций, таск-менеджмента, модульного согласования разных фичей и т.д..
    А если учесть, что гитхаб ломится от готовых блогов, магазинов, чатов, виджетов, систем работы с комментариями в виде приложений для джанго, а эти приложения егко собираются в один проект и не толкаются друг с другом локтями при этом, то тут вполне можно понять почему Джанго так популярен.
    Питон в целом и Джанго в частности дают скорость разработки, которой позавидуют любые другие языки и фреймворки. При этом язык довольно свежий, современный и удобный.

    Однако меня смущает ваша постановка вопроса. Такое ощущение, что вы себе стек подбираете по озвученным критериям. Эдак могу посоветовать идти в перловики. На перле тонны легаси, в котором сейчас хрен кто ладу даёт, все бегут на что-то покомфортнее, а зарплаты у перловиков из-за вакуума на рынке не маленькая. Ну там, где это вижу я. Да, будущего у языка нет, но здесь и сейчас можно постричь бабла и подоминировать на своей нещаменимости=).
    Java - это жирный энтерпрайз, там всегда были и будут деньги. Полагаю крупные компании не сильно боятся обучать себе джунов, потому что эти джуны не улизнут в стартапы и будут залочены на корпоративный сегмент.
    Почему меня сутил ваш подход. Дело в том, что разных направлений развития много и в каждом можно преуспеть, но преуспеть в любом направлении сложнее, если вы выбрали его не по "зову сердца", а по меркантильным соображениям и требованиям рынка. У вас может просто не хватить мотивации, чтобы добиться нужного уровня профессионализма для востребованности в выбранном сегменте.
    Ответ написан
    Комментировать
  • Почему search field не возвращает результат поиска?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Начать нужно с того. что никогда не стрелять себе в ногу вот таким вот способом:
    try:
        object_list = Questions.objects.filter(Q(q_name__icontains=q))
    except Exception:
        print('Ошибочка')

    Это хороший способ замести поблему под коврик, а потом искать её спрашивая всех вокруг.
    Это равносильно тому, чтобы закрыть глаза и бежать. а потом удивляться и спрашивать откуда шишка на лбу.

    Подключите логирование, вынесите в фонфиге в отдельный лог-файл все debug-логи этого модуля и вообще все ошибки. Прологируйте детально все этапы с указанием количества найденных элементов, в общем всё, по порядку, что может пойти не так.
    Откройте лог-файл командой tail -F my_log_file.log в терминале, и вы будете в реальном времени видеть всё, причем гораздо лучше, чем напечатанное принтом.
    Вы можете убрать временно вообще все условия в фильтрации для поиска и проверить работает ли вывод и корректно ли сработает шаблон. А мы тут как заглянем в вашу БД? Может она пустая или вы коннектитесь не туда.
    Ответ написан
  • Как создать чат между пользователем в телеграм боте и посетителем сайта?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Судя по постановке вопроса и вашей собственной оценке вашей же подготовки в прогрммировании: вам еще рано решать такие задачи. Просто нет необходимого уровня понимания, и это одной статьёй не решить. Разве что если б кто-то расписал в подробных деталях как сделать именно то, что вам нужно, но запрограммировать это проще, чем описывать в необходимых вам подробностях.
    А так получается у вас нет конкретного вопроса, на который можно было бы конкретно ответить.

    В это йситуации вам никак не уложиться в дедлайн, если вы настаиваете на смостоятельном написании этой функциональности.

    Вам стоит либо обратиться к фрилансеру, либо купить готовое решение из тех что уже есть на рынке, например, https://replain.cc/ru
    Ответ написан
    Комментировать
  • Как устранить ошибку: "can only concatenate str (not "int") to str: Django?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    У вас, очевидно, selected_choice.votes - это строка, а вы пытаетесь применть оператор += с елым числом. Об этом вам и выдаётся ошибка. Нельзя к строке прибавить число.

    Пожалуйста, впредь приводите полный код. В частности не хватает описания модели Choice.
    А ещё нужно приводить целиком стек-трейс, чтобы не заставлять отвечающих читать ваш код целиком выискивая глазами причину ошибки.

    В модели нужно votes сделать целочисленным,если вы хотите прибавлять к этому полю числа. Иногда тип поля меняют, но необходимые миграции не накатыают на БД и при десериализации инстанса модели у этого инстанса атрибут, обозначенный в модели как целочисленный. может оказаться строковым, как по-прежнему указано в схеме БД.

    Делайте миграции или меняйте схему вручную для приведения в соответствие с моделью.
    Ответ написан
    1 комментарий
  • Как решить ошибку импорта, кроме как ипортировать локально?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Такие ошибки возникают когда код неправильно разбит на модули и модули ссылаются друг на друга циклически. К примеру модуль А что-то импортирует из Б, Б импортирует из В, а В из А.
    При импорте происходит выполнение кода импортируемого модуля, если это выполнение не было еще сделано ранее.
    Нужно
    1) не импортировать лишнее
    2) изолировать зависимости. Выносить в отдельные мдули те части, которые не зависят от других.

    Приводите конкретный пример и вам расскажут как правильно всё разбить, чтобы такой проблемы не было.
    Ответ написан
    1 комментарий
  • Как поменять тип данных на выходе из queryset модели?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Пересоздайте БД для чистоты эксперимента, похоже раньше это поле было у вас строковым, вы в коде поменяли, а миграции правильные не сделали.
    Если поможет, а данные в старой БД нужны, то либо правильно описать миграцию данных с конвертированием столбца и переименованием через промежуточный, либо просто ручками в БД один раз сделать и конвертнуть, если у вас в проде это всё ещё не запущено.
    Ответ написан
    3 комментария
  • Django изменение файла модели, перед записью в бд?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    А в чем проблема?
    В БД хранишь нужны результирующий путь. По факту аплоада делаешь таск на распаковку архива. Этот поцесс может оказаться не быстрым и закончиться ошибкой. Таск запускается, а его статус фронтенд запрашивает регулярно через АПИ, или слушает через перманентное подключение по веб-сокету - как уж реализуете. Важно, что распаковка это таск и у него есть статус и прогресс. По факту окончания загрузки помечаете в записи БД где путь, что путь актуален.
    Можно не записывать путь пока не закончится распаковка, тогда путь должен записать таск по факту своего успешного завершения.
    Ответ написан
    Комментировать
  • Нужно создать карту на которую можно ставить метки с текстом и фотографией, с возможностью в будущем эти метку удалить владельцем?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Ну можно SPA замутить и API на фласке.
    Я трогал лифлет давным давно и тогда он мне не очень понравился. Особенно ступенчатостью зумма и видимой подгрузкой. Хотелоь всё сделаь максимально плавно. Сейчас, вроде, появились такие карты в сети, о я с исходниками не знакомился.
    У меня вот так тогда поучилось на уровне прототипа:
    https://sublayers.net
    Там всё сырое и плохо написано. первый мой JS-код, с тех пор и не писал ничего на JS.
    Надо, конечно отрефаторить.
    Суть идеи такая: на базе канваса делается плавный рендер карты и всё это встраиватся в SPA, чтобы в браузере работало без перезагрузок и отчатси в оффлайне. Потом можно в электрон какой-нибудь запечь, или ещё как, чтобы прототип мобильного приложения в рамках MVP быстро сделать можно было.
    На джанго тоже можно сделать SPA, к тому же структура проекта джанго позволяет навешивать на основной проект свои и сторонние приложения, которые смогут нормально друг с другом уживаться. Часто в проекте требуется блоговый движок, авторизации какие-то особенные, дугие интеграции... Все эти батарейки у Джанго в избытке доступны.
    SPA на фласке проще потнятнее, но больше писать самому и нет админки из коробки. Хотя надо поискать, наверняка и для фласка того же есть готовые штуки.

    Ктсати, в ыне поделились подробнее что хотите делать. Может там риалтайм и нагрузки будут... к примеру, мультиагентный трекинг множесва объектов. Тогда я бы посмотрел в стороно асинхронных фреймворков. Однако стартовать, конечно, проще с Джанги. Там тебе и оганично вписанная ОРМ с миграциями, и админка. и пользователи с правами.
    Выщелкнуть что-то в микросервис да с асинхронными потрохами никогда не сложно.
    Ответ написан
  • Нормально ли учить Django более полугода?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    До относитеьно комфортной работы на фрилансе вам надо хотя бы для себя сделать не один такой проект. Можно еще разбирать по косточкам готовые в опенсорсе, чтобы понимать как делаются те или иные вещи. Если встретили что-то непонятное -- нунлите.
    Все реальные задачи куда интереснее и сложнее, чем то, что рассматривается в книжных примерах.
    Ответ написан
    Комментировать
  • Django - Как оптимизировать группировку, чтобы было быстрее?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Попробуйте добавить индекс на пару полей (plu, sku). При выборке сортируйте по ним на упровне БД.
    Используйте itertools.groupby для группировки сперва по plu, а потом и по sku.
    Обходите группировки двумя циклами (один вложен в другой).
    Внутри внутреннего цикла уже можно использовать литерал генератора списка, чтобы получить список pack_type_id.
    Это позволит сразу собирать последовательно элементы словарей и не возвращаться к уже собранным.
    Если вашу структуру нужно поместить в какой-то внешний json-файл или отдавать в тело http-запроса в json-формате, то можно попробовать писать json с помощью какой-нибудь потоковой библиотеки вроде этой: https://pypi.org/project/jsonstreams/
    Это позволит не ждать по отдельности извлечение данных из БД, сборку структуры а пвмяти, а затем сериализацию ее в файл или в поток сокета. Всё будет делаться в рамках одного конвейера, что может оказаться более эффективным по времени.

    Однако вам и ваш способ стоило бы проверить на предмет "бутылочных горлышек" и понять что именно занимает у вас основное время работы вашего алгоритма.
    Возможно радикально ускорить процедуру и не удастся ввиду очень медленной БД или гиганского размера получающейся структуры.

    Расскажите подробнее куда вам нужна такая структура, какой у нее получается объём, куда вы её потом пихаете, как измеряете скорость, почему вам так критична эта скорость?
    Может быть проблема решается и иначе? К примеру, может оказаться, что вам не требуется синхронно возвращать всю структуру, или можно запрос и ответ развести в отдельные запросы, сделав интерфейс более отзывчивым.

    В общем опишите вашу задачу подробнее. Ну и есл что наисал не понятно, спрашивайте. Буду разьяснять детальнее.
    Ответ написан
    Комментировать