以模型形式获取group_by的查询结果,并将其置于select中

时间:2017-05-31 11:54:11

标签: python django python-3.x modelchoicefield

我有一个模型表单,我正在尝试使用下拉列表来填充数据库中的选项。

我的模型表格如下:

class CreateTripsForm(forms.Form):
    start_locations = Mileage.objects.values('start_location').annotate(num_locations=Count('start_location')).order_by('start_location')
    end_locations = Mileage.objects.values('end_location').annotate(num_locations=Count('end_location')).order_by('end_location')
    starting_location = forms.ModelChoiceField(queryset=start_locations, empty_label=None)
    ending_location = forms.ModelChoiceField(queryset=end_locations, empty_label=None)

选择选项在那里,但是它们给出的结果不是我所追求的。选择中的选项如下所示:

{'start_location': 'Location A', 'num_locations': 27}
{'start_location': 'Location B', 'num_locations': 27}
{'start_location': 'Location C', 'num_locations': 27}

我只想让select只显示:

Location A
Location B
Location C

我已经尝试了很多不同的方法来实现这一目标,但我觉得我错过了一些东西。

编辑:

里程模型如下所示:

class Mileage(models.Model):
    miles = models.DecimalField(max_digits=8, decimal_places=1)
    start_location = models.CharField(max_length=255)
    end_location = models.CharField(max_length=255)
    user_id = models.IntegerField(null=True)

    def __str__(self):
        return self.miles

2 个答案:

答案 0 :(得分:0)

我能够通过更改查询集来实现此功能。

我没有使用.values而是将其更改为.values_list('start_location', flat=True),现在它正确地在选择表单中提供了我想要的名称列表。

答案 1 :(得分:0)

您希望显示具有相同模型的不同属性的两个选择。默认情况下,ModelChoiceField使用__str__值的QuerySet方法,因为您在values之前调用了annotate

请勿在查询集中使用values,或使用ModelForm代替ModelChoiceField