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) или лучшей практики,

Я хочу знать, как мне напечатать приведенный выше код?

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

codereverse_code, если поставляется) должны быть вызываемыми объектами, принимающими два аргумента; первый - экземпляр django.apps.registry.Apps, содержащий исторические модели, соответствующие месту операции в истории проекта, а второй - экземпляр SchemaEditor.

.

https://docs.djangoproject.com/en/4.1/ref/migration-operations/#django.db.migrations.operations.RunPython

.

Итак, если вы хотите аннотировать ваши миграции данных с помощью типов, вот подходящие аннотации:

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 веские причины для использования подсказок типов:

  1. Предоставляют помощь разработчикам, использующим функции. В случае с миграциями, функции forwards и backwards используются только внутри Django. Ожидается, что разработчики, читающие ваш код, имеют представление о миграциях. Если они не знают, что такое apps и schema_editor, справедливо ожидать, что они обратятся к документации migrations.RunPython.
  2. Предоставить мета-информацию для некоторых умных инструментов (внутренних или сторонних), использующих интроспекцию для выполнения волшебных вещей.

Если ваш случай не подходит под один из этих двух случаев, или у вас нет других причин использовать подсказки типов, не пытайтесь слепо следовать "политике". Не пишите подсказки только потому, что вы можете. Сохраняйте спокойствие и (пере)читайте Дзен Python :)

TLDR: Попросите своего начальника рассказать вам, зачем ему нужны подсказки типов для миграций. И если ответ будет глупым, напишите глупые подсказки типов. ¯\(ツ)

Вернуться на верх