Можно ли создать тип, который наследуется от модели Django, чтобы добавить ограничения на поля? - PullRequest
0 голосов
/ 16 января 2020

В настоящее время я улучшаю покрытие ввода в моем приложении Django и столкнулся с проблемой:

У меня есть модель A, которая выглядит следующим образом:

class A(models.Model):
  account = models.ForeignKey(Account, on_delete=models.CASCADE)
  limit_amount = models.BigIntegerField(null=True)

In время жизни A экземпляров, с точки зрения бизнеса, я знаю, что у некоторых A экземпляров всегда будет заполнено поле limit_amount.

Итак, в коде я буду использовать некоторые функции такие как:

def get_floored_limit_amount(a: A) -> int:
  return math.floor(a.limit_amount)

Но mypy - по праву - заявит, что limit_amount может быть None и выдаст ошибку.

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

Поэтому моей первой идеей было создать подсказку другого типа, например, в псевдо-python:

type AVariant(A):
  limit_amount: int

и используйте его в указанных функциях. Видите ли вы способ сделать это?


Последнее, что у меня было, - это добавить в класс A метод, который будет проверять правильность каждого поля или выдавать ошибки; и вызывать этот метод в начале каждой функции. Но я не знаю, если это самый чистый способ сделать это.

РЕДАКТИРОВАТЬ: Эта последняя идея не работает с mypy.

...