我正在尝试按 CharField 'name' 订购查询集,但我想排除 'Other' 条目并将其添加为用户选择的最后一个选项......
self.fields["acquisition"].queryset = AcquisitionChannel.objects.exclude(name = "Other").order_by('name')
以上显然不好,因为它排除了“其他”......
可以在 Django 中完成吗?或者我必须使用 Javascript?
谢谢!
我正在尝试按 CharField 'name' 订购查询集,但我想排除 'Other' 条目并将其添加为用户选择的最后一个选项......
self.fields["acquisition"].queryset = AcquisitionChannel.objects.exclude(name = "Other").order_by('name')
以上显然不好,因为它排除了“其他”......
可以在 Django 中完成吗?或者我必须使用 Javascript?
谢谢!
要手动将对象添加到 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
它是这样的:
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())
快速简单:使用以下命令添加一个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
)。