Python Django按顺序连接两个查询集
所以我有一个带有select字段的ModelForm。在这个选择字段中,大约有100个条目。在这些条目中,我有很多条目,比如“Organization Colorado-Denver”,我希望它们位于列表的顶部,这样所有带有“Organization Colorado”的条目都位于列表的顶部,其他所有条目都按字典顺序排序 我尝试过创建两个单独的查询集(这似乎是个坏主意,但只有100个左右的条目可以管理)。似乎有很多方法可以组合这两个查询集,但不需要维护顺序(这就是重点)。我试过这个:Python Django按顺序连接两个查询集,python,database,django-queryset,Python,Database,Django Queryset,所以我有一个带有select字段的ModelForm。在这个选择字段中,大约有100个条目。在这些条目中,我有很多条目,比如“Organization Colorado-Denver”,我希望它们位于列表的顶部,这样所有带有“Organization Colorado”的条目都位于列表的顶部,其他所有条目都按字典顺序排序 我尝试过创建两个单独的查询集(这似乎是个坏主意,但只有100个左右的条目可以管理)。似乎有很多方法可以组合这两个查询集,但不需要维护顺序(这就是重点)。我试过这个: class
class CreateContactForm(ModelForm):
...
def __init__(self, *args, **kwargs):
super(CreateContactForm, self).__init__(*args, **kwargs)
p = models.ConstantContactList.objects.filter(
name__startswith=settings.PREF_ORGANIZATION_PREFIX
)
np = models.ConstantContactList.objects.filter(
name__regex=r'^(?!{})'.format(settings.PREF_ORGANIZATION_PREFIX)
).order_by('-name')
self.fields['cc_lists'].queryset = list(p) + list(np)
如果有某种方法可以将该列表转换回查询集,或者如果有一种方法可以绕过查询集,那么这可能行不通?我不确定。有人能给我提供一个我应该做什么的线索吗?我建议不要尝试对查询集进行排序,而只是在渲染层(模板或表单)中进行排序。这样,如果您想本地化代码,就不必更改查询
假设您使用的是
表单。请选择小部件。您可能希望从这个小部件继承并覆盖render\u菜单
逻辑,以便自己构造它并处理排序。您将有权访问渲染或未渲染选项,因此从那时起,这不应该是一个问题。好的。我已经想出了一个在这里有效的解决方案,我正在为其他有同样需求的人提供它
from django.forms.widgets import Select
import re
class CustomOrderingWidget(Select):
def __init__(self, priority_regex, sort='+', attrs=None):
super(CustomOrderingWidget, self).__init__(attrs)
self.regex = re.compile(priority_regex)
self.sort = sort
self.template_name = 'django/forms/widgets/select.html'
def render(self, name, value, attrs=None, renderer=None):
context = self.get_context(name, value, attrs)
optgroups = context.get('widget').get('optgroups')
firsts, others = [], []
for grp in optgroups:
if self.regex.search(grp[1][0].get('label')):
firsts.append(grp)
else:
others.append(grp)
if self.sort == '+':
kfn = lambda x: x[1][0].get('label')
context['widget']['optgroups'] = sorted(firsts, key=kfn) +\
sorted(others, key=kfn)
elif self.sort == '-':
kfn = lambda x: x[1][0].get('label')
context['widget']['optgroups'] =\
sorted(firsts, key=kfn, reverse=True) +\
sorted(others, key=kfn, reverse=True)
else:
context['widget']['optgroups'] = firsts + others
return self._render(self.template_name, context, renderer)
然后你可以把它插入到这样的模型中
import settings # YOUR personal stuffz!
class CreateContactForm(ModelForm):
...
class Meta:
...
widgets = {
# Just an example, make your own regex string!
'cc_lists': CustomOrderingWidget("^{0}".format(
settings.PREF_ORGANIZATION_PREFIX
))
}
您是否尝试过不使用两个列表
组合?我现在没有访问Django的权限进行测试,但它可能只是在SQL中创建一个UNION()
,将两个QuerySetp
和np
@C14L不支持的+:“QuerySet”和“QuerySet”操作数类型组合起来,这似乎更合理。