Python+使函数更通用

2024-09-28 01:26:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

基本上,此函数将按forms.ChoiceField的预期返回choices。我需要在一些地方这样做,并希望使上面的函数更通用。我知道如何使industries = Industry.objects.all().order_by('name')成为通用的,但第二部分是我不确定的。当创建元组时,它有(ind.id, ind.name)ind.name可以是任何值,具体取决于传入的模型(模型中可能不总是有name)。在

我试着在一些地方读到这方面的内容,包括:

Passing functions with arguments to another function in Python?

上面的资源展示了如何使用传入的函数来实现它,但是这似乎有点过头了?不管怎样,如果我必须将一个函数作为参数传递,那么用另外一个函数使它更通用又有什么意义呢?在

[编辑]

基本上我想制作类似的东西:

^{pr2}$

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


Tags: 函数namein模型idbyobjectsorder
3条回答

也许这有助于:

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'))

从你的问题很难判断,但我认为你缺少的是getattr()。例如

ind = something()
for field in ['id', 'name']:
    print getattr(ind, field)

实际上,Django已经有了一个快捷方式:values_list。在

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

或者

^{pr2}$

相关问题 更多 >

    热门问题