gpt4 book ai didi

python - 根据选择字段中的值对 Django 查询集进行排序

转载 作者:行者123 更新时间:2023-12-03 19:55:52 24 4
gpt4 key购买 nike

我有一个模型,

class Example(models.Model):
MY_CHOICES = (
("yes", _("Yes")),
("no", _("NO")),
("not_sure", _("Not sure")),
)
name = models.CharField(max_length=200, verbose_name=_('Name'))
status = models.CharField(max_length=100,choices=MY_CHOICES,default='yes')

我需要在 get_queryset 方法中对查询集进行排序,即,
def get_queryset(self, request):
qs = self.model._default_manager.get_queryset()
order = ['yes', 'no', 'not_sure']
qs = #CODE TO ORDER THE S HERE BASED ON order.
return qs

*我需要的返回值是一个 QuerySet 而不是一个排序列表。
*qs 需要根据状态值按照'yes'、'no'、'not_sure'的顺序进行排序。

请注意:我需要基于对象属性值(即状态值)的 thr QS。按照 status='yes' 的顺序对象先是 'no' 和 'not_sure'

最佳答案

给定 this previous SO Q/A

并保留你的代码,我会说

def get_queryset(self, request):
qs = self.model._default_manager.get_queryset()
order = ['yes', 'no', 'not_sure']
return sorted(qs, key=lambda x: order.index(x.status))

但是,我宁愿让 DB 来代替。
看看 this QA一个不错的技巧:
ORDER BY idx(array['yes', 'no', 'not_sure'], status)

将上面的SQL片段添加到django的ORM生成的查询中(或者创建一个ex-novo)并执行 raw query用它:
def get_queryset(self, request):
qs = self.model._default_manager.get_queryset()
newquery = qs.query+' ORDER BY idx(array'+order.__str__()+', status)'
return self.model._default_manager.raw(newquery)

它应该可以工作,前提是没有 order by子句已经在 sql 中。我还没有测试过。

关于python - 根据选择字段中的值对 Django 查询集进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31517469/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com