Коробка с питоном
537 subscribers
49 photos
128 links
Заметки от Python-разработчика: сниппеты, обзоры пакетов, новости и другая полезная информация.
Download Telegram
Если вы пишите на Django или собираетесь писать на нём, я нашёл довольно адекватный и хороший стаилгайд от HackSoftware, который позволит вашему коду на Django не превратиться в макароны.

Стаилгайд описывает большинство кейсов, с которыми сталкивается разработчик - от взаимодействия с моделями и сервисами, до тестирования и работы с Celery.

#ссылочки #django
Проект который я пишу в основном на Django, поэтому в следующее время будет довольно много ресурсов по ней 🌚
Есть задача реализовать импорт/экспорт сущностей (в различных форматах), библиотека django-import-export позволяет сделать это в кратчайшие сроки. Можно, конечно, реализовать свой импорт/экспорт, но зачем изобретать велосипед? К слову, библиотека поддерживается, активность на гитхабе есть, поэтому с ней проблем быть не должно.

Что она умеет?
- Экспорт в различные форматы: Excel, CSV, JSON и вообще любой другой формат, который поддерживает tablib
- Интеграция с админкой (импорт, экспорт)
- Превью импорта
- Экспорт с поддержкой фильтров

Github | Документация
#библиотека #django
Скучали по Django? Вот вам ещё пакетик.

Если вам нужно реализовать историю изменения данных в моделях, то django-simple-history может это сделать для вас.

GitHub | Документация

#django #библиотека
Небольшой хинт, да, снова #django.

У меня есть небольшая задача, в которой мне нужно изменять файл в Celery задаче. Дефолтный update менеджера модели работать не будет, поэтому устанавливаем атрибуты и вызываем save на объекте.

Работать он не будет, потому что QuerySet.update() не вызывает save() на модели, поэтому механизмы сохранения файлов в сторадже отрабатывать не будут.

Первая картинка - моделька, вторая - как оно работает. Ваши варианты можете кидать в коменты, интересно послушать.
Опять пост про ORM, надеюсь пока последний (хотя, кто его знает...)

Новая фича с рекомендациями репозиториев на гитхабе меня радует. Нашел вот такой cheatsheet для Django ORM, описывает пример запроса и генерируемый SQL-код. Очень полезно, если вы знаете SQL, но не знаете как выразить тот или иной запрос через Django ORM.

#ссылочки #django
🔥1
У меня тут небольшая хотелка возникла, я захотел исходя из описаний полей в Pydantic модели генерировать запрос на выборку с фильтрацией из БД.

Оказывается, кто-то уже сделал похожее для Django. Выглядит неплохо, но всё же саму генерацию запроса я бы вынес в отдельный класс :)

#django #pydantic #eng #статья
Django 4.1 вышел! Список изменений, из интересного:

1) Асинхронный интерфейс к ORM. Под капотом выполняет sync_to_async(), про лимиты и подводные камни можно почитать тут. Сделали как и предполагал, чтобы сделать асинхронный get нужно добавить букву a в начало - aget, afirst и т.д.
2) В CBV можно делать асинхронные методы. Подробнее тут.
3) То, чего мне не хватало - ограничения Check, unique и exclusion проверяются во время валидации модели.
4) Добавили команду optimizemigration которая попытается оптимизировать миграции.

#новости #django
3
Нашел свежий доклад со сравнением использования CTE и SFW в Django ORM и SQLAlchemy, спойлер: джанга в такие штуки не умеет, пишите raw sql.

Ещё внезапно для себя узнал насколько алхимия мощная в плане рефлексии и как с ней легко работать используя уже существующую базу.

#посмотреть #sqlalchemy #django
Когда-то давно, когда я только изучал Django, мне хотелось избавиться от бойлерплейта в темплейтах и вынести некоторые части шаблонов (например кнопки) в какие-то отдельные сущности которые можно переиспользовать - например в виде компонентов.

К счастью, в Django есть решение для этого и оно называется template tags. Но у него есть несколько проблем:
1) Необходимо пробрасывать руками js и css зависимости для конкретного тега там, где он используется.
2) Теги плохо кастомизируются, например нет возможности изменить поведение тега, обязательно нужно его переписывать.

Решением этих вопросов занимается пакет с названием django-components. Он предоставляет возможность делать простые, но в то же время мощные переиспользуемые компоненты. А как он справляется с проблемами выше?
1) При объявлении компонента будут грузиться только те js и css, которые указаны в классе компонента. Класс компонента выглядит как-то так:

from django_components import component

@component.register("calendar")
class Calendar(component.Component):
template_name = "calendar/calendar.html"

def get_context_data(self, date):
return {
"date": date,
}

class Media:
css = "calendar/calendar.css"
js = "calendar/calendar.js"

Сам js/css рендерится только там, где указаны теги component_js_dependencies и component_css_dependencies.

2) Для изменения поведения компонента можно использовать слоты - это что-то вроде django-блоков внутри компонента. Например, мы можем сделать блок body внутри компонента и изменять его вид тогда, когда нам нужно:

<div class="calendar-component">
<div class="header">
{% slot "header" %}Заголовок календаря{% endslot %}
</div>
<div class="body">
{% slot "body" %}Сегодня <span>{{ date }}</span>{% endslot %}
</div>
</div>

А теперь импортируем компонент и меняем его body:
{% component_block "calendar" date="2020-06-06" %}
{% slot "body" %}А сегодня точно <span>{{ date }}</span>?{% endslot %}
{% endcomponent_block %}

Github | PyPi

#django #библиотека
🔥3
Если вы хоть раз задумывались о том, можно ли фичи FastAPI (автогенерация OpenAPI, интеграция с Pydantic, поддержка асинхронности и т.д.) добавить в Django, то я пришел вас обрадовать - есть такой проект под названием django-ninja.

Из приятных фич, которые можно встретить здесь:
1) Версионирование и возможность создания нескольких API инстансов со своей авторизацией и т.д.
2) Класс схемы интегрирован с модельками Django, поэтому можно писать что-то вроде такого:

@api.get("/tasks", response=List[TaskSchema])
def tasks(request):
return Task.objects.all()

3) Можно делать схемы из моделей, прям как в DRF.
4) Пагинация! При чем в документации показано, как можно сделать собственный кастомный класс для неё.
5) Поддержка кастомных рендереров ответов, что позволяет перевести сериализацию на ORJSON или отдавать ответы в XML, например.
6) Работа с аутентификацией из под коробки.
7) Ну и асинхронность, тем более разработчики Django работают над ней.
А в остальном он очень похож на FastAPI, особенно когда речь идет о работе с аргументами, схемами и OpenAPI.

Как по мне, выглядит как достойная замена DRF, при чем довольно простая. И об этом я говорю не просто так - в последнее время я делал проекты на FastAPI и возвращаться на Django и тем более DRF было очень непривычно.

Github | Документация

#django #библиотека
🔥5😢2