我的方法之一采用
status
中使用的
filter()
参数。
此参数与定义如下的模型字段相关:
STATUS_CHOICES = (
(1, _("draft")),
(2, _("private")),
(3, _("published")),
)
class MyModel(Model):
status = models.PositiveSmallIntegerField(_("status"), choices=STATUS_CHOICES, default=1)
我想使用 Python 的类型提示来使其定义更清晰。
我可能会做类似的事情:
def my_method(status: int):
...
但是状态必须包含在
STATUS_CHOICES
中。
我可以使这个提示更具限制性并仅限于
STATUS_CHOICES
值吗?
是的,可以使用枚举类型提示使提示更具限制性,并将状态限制为
STATUS_CHOICES
中的值。
from enum import Enum
from typing import Tuple
from django.db import models
from django.utils.translation import gettext_lazy as _
class Status(int, Enum):
DRAFT = 1
PRIVATE = 2
PUBLISHED = 3
STATUS_CHOICES: Tuple[Tuple[int, str], ...] = (
(Status.DRAFT.value, _("draft")),
(Status.PRIVATE.value, _("private")),
(Status.PUBLISHED.value, _("published")),
)
class MyModel(models.Model):
status = models.PositiveSmallIntegerField(_("status"), choices=STATUS_CHOICES, default=Status.DRAFT.value)
def my_method(status: Status):
...
此代码执行以下操作:
-
定义一个
Status
枚举: 这将创建一个Status
枚举,它明确地将每个状态名称(如DRAFT
、PRIVATE
、PUBLISHED
)与其对应的整数值相关联。 -
使用
Status.value
在STATUS_CHOICES
中: 这确保STATUS_CHOICES
使用枚举成员的值,从而保持一致性。 -
在
MyModel.status
中使用Status.DRAFT.value
作为默认值: 这将默认状态设置为枚举中的DRAFT
值。 -
对
my_method
的status
参数使用Status
类型提示: 这强制my_method
仅接受Status
枚举中定义的有效状态值作为其status
参数。
通过使用枚举,可以提高代码的可读性并减少错误,因为它显式定义了允许的状态,并且类型提示强制的代码使用这些状态。
标签:python,django,python-typing From: 70084167