python - 模型选择类

标签 python django python-2.7 django-1.8

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

这就是我想要的:

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)

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

option = "ONE"
getattr(TestModel.choices_obj, "OPTION_{}_SHORT".format(option))

最佳答案

尝试这样的事情

class FakeChoices:
    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_tuple(self):
        return (
            (self.OPTION_ONE, self.OPTION_ONE_LONG),
            (self.OPTION_TWO, self.OPTION_TWO_LONG)
        )

    def __getitem__(self, key):
        return self.__get_tuple()[key]

    def __iter__(self):
        return iter(self.__get_tuple())

...

class TestModel(models.Model):
    field = models.CharField(choices=FakeChoices())

正如您想象的那样,您可以将各种疯狂的逻辑放入 FakeChoices 类中。你应该能够做到

option = "ONE"
getattr(TestModel._meta.get_field('field').choices, "OPTION_{}_SHORT".format(option))

关于python - 模型选择类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36066229/

相关文章:

python - 如何从 url 中删除查询?

python elementtree xml追加

python - 使用 mod_wsgi 部署具有域和子域的 django 应用程序

python - 如何使用 Django、Jenkins 和 Sonar 获得测试覆盖率?

python-2.7 - Python进程被杀死

python - 文件在默认下载文件夹中持续下载

python - 为什么在 Python 解释器中键入 _ 会返回 True?

Django Rest 框架、CSRF 和 Vue.js

python - 基于csv数据使用nsetools并行获取股票价格

python - 从列表中提取时间值并添加到新列表或数组