0

我正在尝试按 CharField 'name' 订购查询集,但我想排除 'Other' 条目并将其添加为用户选择的最后一个选项......

self.fields["acquisition"].queryset = AcquisitionChannel.objects.exclude(name = "Other").order_by('name')

以上显然不好,因为它排除了“其他”......

可以在 Django 中完成吗?或者我必须使用 Javascript?

谢谢!

4

3 回答 3

0

要手动将对象添加到 QuerySet,请尝试_result_cache

other = AcquisitionChannel.objects.get(name="Other")    
objs = AcquisitionChannel.objects.exclude(name="Other").order_by("name")
len(objs) #hit the db to evaluate the queryset.
objs = objs._result_cache.append(other)
self.fields["acquisition"].queryset = objs
于 2013-09-24T14:17:38.877 回答
0

它是这样的:

def get_choices():
    choices = AcquisitionChannel.objects.exclude(name = "Other").order_by('name').values_list('value_column', 'text_column')
    other = AcquisitionChannel.objects.filter(name = "Other").values_list('value_column', 'text_column')
    choices = list(choices)
    other = list(other)
    return choices + other

然后:

acquisition = forms.ChoiceField(choices=get_choices())
于 2013-09-24T19:01:29.563 回答
0

快速简单:使用以下命令添加一个order具有特殊值的列extra()

self.fields["acquisition"].queryset = (
    AcquisitionChannel.objects
    .extra(select={'order': '(CASE name WHEN %s THEN 1 ELSE 0 END)'},
           select_params=['Other'],
           order_by=['order', 'name']))

使用params,此方法适用于任何数据库(支持CASE)。

于 2013-09-24T14:40:33.080 回答