Как сделать ввод в поле модели django?
Недавно добавив в VS Code вставные типы для python, я заметил, что типизация для поля Field будет выглядеть следующим образом:
Как вы видите, это Field[Unknown, Unknown]
. Как вы знаете, если вы не укажете тип поля, вы не получите подсказки атрибутов для поля, и поле будет показано как Unknown
.
Вы можете просто указать тип str
, если у вас, например, есть CharField
, примерно так:
field: str = models.CharField()
Проблема в том, что если вы хотите использовать сильно типизированный линтер - он выдаст ошибку, что присвоенное значение не имеет типа str
.
Итак, я увидел этот вкладыш и начал играть с этим дженериком, и заметил, что второй параметр дженерика будет типом, используемым для представления атрибута поля:
Мой вопрос в том, знает ли кто-нибудь, для чего используется первый параметр дженерика, и где вообще создается этот дженерик, потому что внутри пакета я вижу, что класс Field
не наследует никаких дженериков.
Django не позволяет мутировать поля, так как изменение поля модели приведет к миграции базы данных.
Тем не менее, под капотом многие поля используют одни и те же типы и в принципе заменяемы. Например, ImageField
просто хранит путь к строке, аналогично тому, что может делать CharField
. Хотя внутреннее представление данных или способ хранения данных в поле может отличаться для некоторых полей.
Тем не менее, все поля имеют огромную функциональность и обычно глубоко встроены и подключены к фреймворку. Поэтому поля модели django не являются общими. Думаю, ваша IDE делает что-то, ... не подходящее :)
В документации вы можете найти дополнительную информацию о полях. Здесь вы можете найти список всех встроенных полей.
edit:
Я подумал еще немного над этим вопросом. Почти все поля, я верю все они, расширяют класс models.Field
. Так что это может быть причиной того, что ваша IDE делает это. Какая-то полиморфная штука была активирована в генераторе кода или что-то еще.
Я думаю, что лучший способ набрать поле, чтобы получить подсказки атрибутов (методов и атрибутов) значения поля и не получить ошибок линтинга при использовании сильной или базовой типизации - это использовать Union
и сделать что-то вроде этого:
username: str|CharField = CharField()