Django typehinting
Я создал пустую миграцию, которая теперь выглядит следующим образом:
def forwards(apps, schema_editor):
Foo = apps.get_model('app', 'Foo')
FixedResponse.objects.create(name='Bar')
def backwards(apps, schema_editor):
Foo = apps.get_model('app', 'Foo')
Foo.objects.filter(name='Bar').delete()
class Migration(migrations.Migration):
dependencies = [
('app', '0035_fixedresponse'),
]
operations = [
migrations.RunPython(forwards, backwards)
]
Поскольку нигде нет документации по Django на эту тему (Migrations specific) или лучшей практики,
Я хочу знать, как мне напечатать приведенный выше код?
Документация:
. .
code
(иreverse_code
, если поставляется) должны быть вызываемыми объектами, принимающими два аргумента; первый - экземплярdjango.apps.registry.Apps
, содержащий исторические модели, соответствующие месту операции в истории проекта, а второй - экземплярSchemaEditor
.
Итак, если вы хотите аннотировать ваши миграции данных с помощью типов, вот подходящие аннотации:
from django.apps.registry import Apps
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
def forwards(apps: Apps, schema_editor: BaseDatabaseSchemaEditor):
...
На этот вопрос нет универсального ответа, и единственный авторитетный источник, в котором вы найдете информацию об этом - документация Django, в которой нет никаких упоминаний об аннотациях для миграций.
"Правильный способ работы с подсказками типов в Django" строго зависит от политики вашей компании. Прежде чем спрашивать "как?", вы должны спросить "почему?". Если вместо вопроса "почему?" вы (или ваш начальник) спрашиваете "почему нет?", это неверный подход к вопросу. Вам нужна причина, чтобы что-то сделать, но вам не нужна причина, чтобы что-то не делать.
Если причина в том, чтобы "сдать CI", то это не уважительная причина. CI должна работать на вас, а не наоборот.
Я вижу 2 веские причины для использования подсказок типов:
- Предоставляют помощь разработчикам, использующим функции. В случае с миграциями, функции
forwards
иbackwards
используются только внутри Django. Ожидается, что разработчики, читающие ваш код, имеют представление о миграциях. Если они не знают, что такоеapps
иschema_editor
, справедливо ожидать, что они обратятся к документацииmigrations.RunPython
. - Предоставить мета-информацию для некоторых умных инструментов (внутренних или сторонних), использующих интроспекцию для выполнения волшебных вещей.
Если ваш случай не подходит под один из этих двух случаев, или у вас нет других причин использовать подсказки типов, не пытайтесь слепо следовать "политике". Не пишите подсказки только потому, что вы можете. Сохраняйте спокойствие и (пере)читайте Дзен Python :)
TLDR: Попросите своего начальника рассказать вам, зачем ему нужны подсказки типов для миграций. И если ответ будет глупым, напишите глупые подсказки типов. ¯\(ツ)/¯