【发布时间】:2018-05-22 19:22:21
【问题描述】:
编辑(背景信息)
我创建了一个自定义 UserModelChoiceField 类,该类接受用户的 QuerySet 并使用他们的全名填充选择字段:
class UserModelChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
return "{} ({})".format(obj.get_full_name(), obj.username)
我现在正在尝试像这样使用这个类:
calibrated_by_internal = UserModelChoiceField(
queryset=total_qs,
required=False,
widget=forms.Select(attrs={"class": "form-control"})
)
.
原始问题
我正在尝试创建一个自定义排序的 QuerySet,它允许我将 User ModelChoice 选择字段放在按字母顺序排序的表单上,但特定权限组的 3 个成员放在顶部。
例如:
小组成员: 查理、艾伦、布赖恩
不是该组的成员: 本、克里斯、艾丽西亚……等等。
必需的查询集/选择字段排序: Alan、Brian、Charlie、Alicia、Ben、Chris...等。
鉴于我使用的是 Django 1.11,我想我会尝试新的 .union ORM 函数:
group_members = User.objects.filter(groups__name="AddEditCalibrations").order_by("first_name", "last_name")
everyone_else = User.objects.exclude(username__in="group_members").order_by("first_name", "last_name")
total_qs = group_members.union(everyone_else)
这只会引发错误:
DATABASE ERROR - ORDER BY not allowed in subqueries of compound statements
如果没有 2 个 ORDER_BY,它似乎可以正常工作,但是列表没有按字母顺序排序,并且需要位于选择顶部的该组的成员(QS 中的第一个)只是与每个人混合在一起否则。
所以我尝试了更简单的:
total_qs = User.objects.order_by(groups__name="AddEditCalibrations", "first_name", "last_name")
这会引发错误:
SyntaxError: positional argument follows keyword argument
编辑
按照 rajkris 的建议,我尝试过使用 itertools:
total_list = list(chain(group_members, everyone_else))
鉴于我需要一个 QS 来填充选择字段,然后我尝试将其转换回 QS:
total_qs = User.objects.filter(username__in=total_list)
但这只是给我一个未排序的列表,所有用户混合在一起,没有任何排序。
【问题讨论】:
-
您使用的排序(User.objects.sort())是什么?是你定义的管理器方法吗?
-
抱歉,从内存中复制代码时出现拼写错误(我以前使用的另一种语言挂断)我已经更新了问题,引发的错误消息仍然相同。
-
order_by 将不接受关键字参数。我认为您不能根据您的情况使用 order_by
标签: django django-forms django-orm