Django Modelchoicefield以不同的格式赋值

时间:2014-08-18 22:19:04

标签: django model

我使用ModelChoiceField创建了表单并从数据库模型中加载了值。 我使用下面的代码创建表单

class MetamodForm(forms.Form):
     metamodule_name = forms.ModelChoiceField(queryset=Metamodule.objects.all().values("name").distinct(),empty_label='Pick a Meta module')

但我的输出格式为

{'name': u'CCD infra'}
{'name': u'dependf'}
{'name': u'BAR weste'}

我不知道为什么我得到上面的输出。请给我一个解决方案。

2 个答案:

答案 0 :(得分:0)

在此示例中,由于您使用.all(),因此您不应该使用distinct。

https://docs.djangoproject.com/en/1.6/ref/models/querysets/#django.db.models.query.QuerySet.values

值返回QuerySet之外的其他内容(一个ValuesQuerySet),这就是为什么你没有得到你想要的格式。

解决方案是不要在查询集上使用.values和.distinct调用。

替换

forms.ModelChoiceField(
    queryset=Metamodule.objects.all().values("name").distinct(),
    empty_label='Pick a Meta module')

使用

forms.ModelChoiceField(
    queryset=Metamodule.objects.all(),
    empty_label='Pick a Meta module')

我猜你正在尝试让模型形式显示“' name'字段作为选择。您可以编写Metamodule的unicode方法来影响它在表单上的显示方式,也可以使用ModelChoiceField的label_from_instance。

https://docs.djangoproject.com/en/1.6/ref/forms/fields/#django.forms.ModelChoiceField

答案 1 :(得分:0)

仅在PostgreSQL上,您可以传递位置参数(* fields)以指定DISTINCT应应用的字段的名称。

因此,如果你正在使用PostgreSQL,你可以这样做:

Metamodule.objects.distinct('name)

如果没有,这是一个可能的kludge。我确定有人会用同样的东西更新这个。

metamodules = Metamodule.objects.all()
metamodule_name_list = []
metamodule_id_list = []
for metamodule in metamodules:
    if metamodule.name not in metamodule_name_list:
        metamodule_name_list.append(metamodule.name)
        metamodule_id_list.append(metamodule.id)
distinct_metamodules_by_name = Metamodule.objects.filter(id__in=metamodule_id_list)

forms.ModelChoiceField(
    queryset=distinct_metamodules_by_name,
    empty_label='Pick a Meta module')

我不知道你为什么这样做,但请注意,虽然你会得到一个独特的名字"在你的下拉列表中, 在视图中处理时,您可能无法获得您实际需要的ID /对象。