django 继承选择类以扩展它?

hgncfbus  于 2023-01-14  发布在  Go
关注(0)|答案(1)|浏览(131)

我的www.example.com中有一个字段models.py,它接受类中确定的选项:

from apps.users.constants import UserChoices

class User(models.Model):
    choices = models.CharField(max_length=10, blank=True, choices=UserChoices.choices(), default=UserChoices.PUBLIC_USER)

选择类如下所示:

from django.utils.translation import ugettext_lazy as _

class UserChoices:
    PRIVATE_USER = "private_user"
    PUBLIC_USER = "public_user"

    @classmethod
    def choices(cls):
        return (
            (cls.PRIVATE_USER, _("Private User")),
            (cls.PUBLIC_USER, _("Public User")),
        )

我的疑问是如何将这个UserChoices类继承到另一个选择类,以便用另一个选项扩展它。
我尝试了以下方法:

class ExtendedChoices(UserChoices):

    OTHER_CHOICE = "other_choice"

    @classmethod
    def choices(cls):
        return (
            UserChoices.choices(),
            (cls.OTHER_CHOICE, _("Other choice")),
        )

但它给了我一个迁移错误:

users.OtherModel.other_choice: (fields.E005) 'choices' must be an iterable containing (actual value, human readable name) tuples.

显然,这个例子被简化了,实际代码在原始类上有40多个选项,在扩展类中有20多个选项。

kknvjkwl

kknvjkwl1#

您需要从父对象中解包这些对象,您可以使用 * 星号 *(*)执行此操作:

class ExtendedChoices(UserChoices):

    OTHER_CHOICE = "other_choice"

    @classmethod
    def choices(cls):
        return (
            *UserChoices.choices(),  # ← an asterisk to unpack the tuple
            (cls.OTHER_CHOICE, _("Other choice")),
        )

如果我们在另一个元组中拆包一个元组,我们构造一个元组,它包含拆包元组的所有项作为新元组的元素。例如:

>>> x = (1,4,2)
>>> (x, 5)
((1, 4, 2), 5)
>>> (*x, 5)
(1, 4, 2, 5)

如果我们因此不使用星号,则它将简单地将x视为元组,并且因此我们构建具有元组x作为第一元素的2元组。
如果我们解包第一个元组,我们将获得一个4元组,其中前三个元素源自x,后跟5

相关问题