Перезапись полей AbstractClass с помощью mypy и Django - PullRequest
0 голосов
/ 06 августа 2020

В нашем проекте мы подклассифицируем модель AbstractUser из Django:

class User(AbstractUser):
    username = None
    email = models.EmailField(max_length=255, unique=True)
    first_name = models.CharField(max_length=50)
    last_name_prefix = models.CharField(max_length=50, blank=True)
    last_name = models.CharField(max_length=50)
    registered_on = models.DateTimeField(default=now, editable=False)
    organizations = models.ManyToManyField(
        "Organization", through="UserOrganization"
    )

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS: List[str] = []

    def __str__(self):
        if not self.last_name_prefix:
            return f"{self.first_name} {self.last_name}"
        return f"{self.first_name} {self.last_name_prefix} {self.last_name}"

Мы хотим удалить поле имени пользователя, и, как указано в Django документах, вы сделаете это, установив поле на None. Однако мы также используем mypy, и он жалуется, что тип None несовместим со значениями, которые он ожидает для charfield:

error: Incompatible types in assignment (expression has type "None", base class "AbstractUser" defined the type as "CharField[Union[str, int, Combinable], str]")

Я также попытался удалить поле с помощью delattr, которое сработало, но не не подхвачено Django миграциями. Я знаю, что можно использовать '# type: ignore', но есть ли какой-либо способ исправить это (кроме переписывания класса AbstractUser и его удаления там)?

1 Ответ

1 голос
/ 06 августа 2020

Попробуйте заменить это username = None на

username = models.CharField(max_length=50, default=None)

Таким образом, если вы не передадите какое-либо значение в username, тогда оно будет None.

Вы можете также удалите поле username, если вы его не используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...