Python+;使函数更通用

Python+;使函数更通用,python,django,Python,Django,如果可能的话,我想要一些关于如何使这更通用的指导: def get_industry_choices(self): industries = Industry.objects.all().order_by('name') ind_arr = [(ind.id, ind.name) for ind in industries] return ind_arr 基本上,此函数将返回表单的选项。我需要在一些地方这样做,并希望使上面的函数更通用。我知道如何将industries

如果可能的话,我想要一些关于如何使这更通用的指导:

def get_industry_choices(self):
    industries = Industry.objects.all().order_by('name')
    ind_arr = [(ind.id, ind.name) for ind in industries]

    return ind_arr
基本上,此函数将返回
表单的
选项。我需要在一些地方这样做,并希望使上面的函数更通用。我知道如何将
industries=Industry.objects.all().order_by('name')
作为泛型,但第二部分我不确定。创建元组时,它具有
(ind.id,ind.name)
。根据传入的模型,
ind.name
可以是任何值(模型中可能并不总是有
name

我试着在几个地方读到这一点,包括:

上面的参考资料展示了如何使用传入的函数来实现这一点,但这似乎有点过分了?如果我必须将一个函数作为参数传递,那么用一个以上的函数使它更通用又有什么意义呢

[编辑]

基本上,我想生产类似的产品:

TITLE_CHOICES=(
    (1, 'Mr.'),
    (2, 'Ms.'),
    (3, 'Mrs.'),
    (4, 'Dr.'),
    (5, 'Prof.'),
    (6, 'Rev.'),
    (7, 'Other'),
)

因此,在执行
forms.ChoiceField
时,我可以传入
TITLE\u选项
作为可能的选项。第一个值是提交表单时得到的值,第二个值是用户在表单上看到的值。我希望能够以编程的方式使用任何模型创建它,我在上面的示例中传入模型名称和一个字段,
name
。我想创建元组,使其成为
(id,name)
。但是,
name
可以用不同型号的任何东西来代替……

从你的问题很难判断,但我认为你缺少的是。比如说

ind = something()
for field in ['id', 'name']:
    print getattr(ind, field)
也许这有助于:

from some_app.models import SomeModel


def generate_choices(model, order=None *args):
    choices = model.objects
    if order:
        choices = choices.order_by(order)
    return choices.values_list('pk', *args)


class MyForm(forms.Form):
    my_choice_field = CharField(max_length=1,
                                choices=generate_choices(SomeModel, 'name'))
    other_choice_field = CharField(max_length=1,
                                   choices=generate_choices(SomeModel, 'city', 'state'))

实际上,Django已经有了一个快捷方式:
values\u list

Industry.objects.all().values_list('id', 'name')


+1首先寻找答案抱歉,如果有困惑…但我想知道我是否遗漏了什么,尝试使上述函数尽可能通用。基本上,我希望能够传入任何模型,并从
id
和其中的特定字段创建元组。我认为这就是您要寻找的:这很有效!谢谢我以前从未使用过
getattr
方法。请不要创建新标记,例如
gimme codez
。这是一个更干净的解决方案,但只适用于这个特定的用例。因此,我将保留另一个作为答案,因为它在大多数其他情况下都有效。
fields = ['id', 'name']
Industry.objects.all().values_list(*fields)