首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于模型选择的

用于模型选择的
EN

Stack Overflow用户
提问于 2016-03-17 16:21:09
回答 2查看 1.6K关注 0票数 2

如何使用类来选择Django中的模型?

以下是我想要的:

代码语言:javascript
复制
class ChoicesCls(object):
    def __init__(self):
        self.OPTION_ONE = 'O1'
        self.OPTION_ONE_SHORT = 'Opt 1'
        self.OPTION_ONE_LONG = 'Option 1'
        self.OPTION_TWO = 'O2'
        self.OPTION_TWO_SHORT = 'Opt 2'
        self.OPTION_TWO_LONG = 'Option 2'

    def get_choices(self):
        return (
            (self.OPTION_ONE, self.OPTION_ONE_LONG),
            (self.OPTION_TWO, self.OPTION_TWO_LONG)
        )


class TestModel(models.Model):
    choices_obj = ChoicesCls()
    field = models.CharField(choices=choices_obj.get_choices)

我想要这样的东西的主要原因是在另一个地方我可以做这样的事情

代码语言:javascript
复制
option = "ONE"
getattr(TestModel.choices_obj, "OPTION_{}_SHORT".format(option))
EN

回答 2

Stack Overflow用户

发布于 2016-03-17 16:25:57

主要问题是,您正在尝试初始化类实例之外的某些内容,以便您可以这样做

代码语言:javascript
复制
field = models.CharField(choices=ChoicesCls().get_choices())

但在我看来,这仍然不是很有用。

我发现更好的方法是从模块导入一个元组列表,并使用它作为选择,不需要为此生成一个类。

这有一个额外的好处,即它允许您做第二件事情,因为您也在模块级别定义了选项。

代码语言:javascript
复制
OPTION_ONE_WITH_A_GOOD_NAME = '1'
OPTION_TWO_WITH_A_GOOD_NAME = '2'

MY_GOOD_NAME_CHOICES = [(OPTION_ONE_WITH_A_GOOD_NAME,OPTION_ONE_WITH_A_GOOD_NAME),
                        (OPTION_TWO_WITH_A_GOOD_NAME,OPTION_TWO_WITH_A_GOOD_NAME)]
票数 0
EN

Stack Overflow用户

发布于 2016-03-17 17:18:32

要扩展Mad Wombat's answer,可以创建一个自定义字段:

代码语言:javascript
复制
class ChoicesCharField(CharField):
    def contribute_to_class(self, cls, name, virtual_only=False):
        super().contribute_to_class(cls, name, virtual_only)

        def get_FOO_display_short(s):
            value = getattr(s, self.name)
            return self.choices.get_short_name(value)
        get_FOO_display_short.__name__ = 'get_{}_display_short'.format(self.name)
        get_FOO_display_short.short_description = self.verbose_name
        get_FOO_display_short.admin_order_field = self.name

        setattr(cls, get_FOO_display_short.__name__, get_FOO_display_short)

这样您就可以使用my_model_instance.get_field_display_short(),就像通常对my_model_instance.get_field_display()所做的那样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36066229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档