Как сделать ввод в поле модели django?

Недавно добавив в VS Code вставные типы для python, я заметил, что типизация для поля Field будет выглядеть следующим образом: enter image description here

Как вы видите, это Field[Unknown, Unknown]. Как вы знаете, если вы не укажете тип поля, вы не получите подсказки атрибутов для поля, и поле будет показано как Unknown. Вы можете просто указать тип str, если у вас, например, есть CharField, примерно так:

field: str = models.CharField()

Проблема в том, что если вы хотите использовать сильно типизированный линтер - он выдаст ошибку, что присвоенное значение не имеет типа str.

Итак, я увидел этот вкладыш и начал играть с этим дженериком, и заметил, что второй параметр дженерика будет типом, используемым для представления атрибута поля: enter image description here

Мой вопрос в том, знает ли кто-нибудь, для чего используется первый параметр дженерика, и где вообще создается этот дженерик, потому что внутри пакета я вижу, что класс Field не наследует никаких дженериков.

Django не позволяет мутировать поля, так как изменение поля модели приведет к миграции базы данных.

Тем не менее, под капотом многие поля используют одни и те же типы и в принципе заменяемы. Например, ImageField просто хранит путь к строке, аналогично тому, что может делать CharField. Хотя внутреннее представление данных или способ хранения данных в поле может отличаться для некоторых полей.

Тем не менее, все поля имеют огромную функциональность и обычно глубоко встроены и подключены к фреймворку. Поэтому поля модели django не являются общими. Думаю, ваша IDE делает что-то, ... не подходящее :)

В документации вы можете найти дополнительную информацию о полях. Здесь вы можете найти список всех встроенных полей.

edit: Я подумал еще немного над этим вопросом. Почти все поля, я верю все они, расширяют класс models.Field. Так что это может быть причиной того, что ваша IDE делает это. Какая-то полиморфная штука была активирована в генераторе кода или что-то еще.

Я думаю, что лучший способ набрать поле, чтобы получить подсказки атрибутов (методов и атрибутов) значения поля и не получить ошибок линтинга при использовании сильной или базовой типизации - это использовать Union и сделать что-то вроде этого:

username: str|CharField = CharField()

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