按出现次数排序查询集

纠结

我有一个Django模型:

class Field:

choice = models.CharField(choices=choices)

value = models.CharField(max_length=255)  

在我的数据库中,有些情况下有3个“字段”具有相同的选择,有些情况下则有1个该选择的字段

我如何排序查询集,使其返回,按选择排序,但所有开头都以3为一组?

例如

[1,1,1,3,3,3,4,4,4,2,5]在哪里1,2,3,4,5可以选择?

肉豆蔻

这是我使用Django ORM可以做的最好的事情。基本上,就像在SQL中一样,您必须构造一个自定义的order_by语句。在我们的例子中,我们将其放置在SELECT中,然后按其排序

1)获取按频率排序的选择列表: [1, 3, 4, 2, 5]

freq_list = (
    Field.objects.values_list('choice', flat=True)
    .annotate(c=Count('id')).order_by('-c', 'choice')
)

2)添加带有枚举的索引: [(0,1), (1,3), (2,4), (3,2), (4,5)]

enum_list = list(enumerate(freq_list))

3)创建案例列表: ['CASE', 'WHEN choice=1 THEN 0', ..., 'END']

case_list = ['CASE']
case_list += ["WHEN choice={1} THEN {0}".format(*tup) for tup in enum_list]
case_list += ['END']

4)将案例列表合并为一个字符串: 'CASE WHEN choice=1 THEN 0 ...'

case_statement = ' '.join(case_list)

5)最后,使用case语句选择一个额外的字段“ o”,该字段将是对应的顺序,然后只需按此字段进行排序

Field.objects.extra(select={'o': case_statement}).order_by('o')

为了简化所有步骤,您可以将以上代码放入Model Manager

class FieldManager(models.Manager):
    def get_query_set(self):
        freq_list = (
            Field.objects.values_list('choice', flat=True)
            .annotate(c=Count('id')).order_by('-c', 'choice')
        )
        enum_list = list(enumerate(freq_list))
        case_list = ['CASE']
        case_list += ["WHEN choice={1} THEN {0}".format(*tup) for tup in enum_list]
        case_list += ['END']
        case_statement = ' '.join(case_list)
        ordered = Field.objects.extra(select={'o': case_statement}).order_by('o')
        return ordered

class Field(models.Model):
    ...
    freq_sorted = FieldManager()

现在您可以查询:

Field.freq_sorted.all()

这将使您Field QuerySet按频率排序choices

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

按出现次数排序

来自分类Dev

MySQL按出现次数排序

来自分类Dev

按出现次数进行计数和排序

来自分类Dev

按出现次数对mysql进行排序

来自分类Dev

MySQL按子串出现次数排序

来自分类Dev

按出现次数对列进行排序

来自分类Dev

SQL-按出现次数排序

来自分类Dev

按元组出现的次数排序-MSQL

来自分类Dev

按出现次数NLTK对Bigram进行排序

来自分类Dev

在一列中按出现次数排序,并查询其他列

来自分类Dev

按日期排序查询集

来自分类Dev

按查询顺序对查询集进行排序

来自分类Dev

按出现次数对字符串行进行排序

来自分类Dev

按Javascript数组中的出现次数(计数)排序

来自分类Dev

按数组中的出现次数进行计数和排序

来自分类Dev

按出现次数最少的顺序对列表进行排序

来自分类Dev

按出现次数对列表进行排序并删除重复项

来自分类Dev

在Django中按ManyToManyField排序查询集

来自分类Dev

按最新记录排序查询集列表

来自分类Dev

SQL:如何计算TableA中的出现次数,与TableB联接,然后按出现次数排序?

来自分类Dev

如何计算列表中的出现次数,然后按出现次数降序排序?

来自分类Dev

按出现次数计算重复次数

来自分类Dev

如何按相关对象数排序查询集?

来自分类Dev

Django按相关模型字段排序查询集

来自分类Dev

按出现次数对数组进行分组并用Lodash对其进行排序

来自分类Dev

如何按Python(pandas)列中的出现次数对数据框进行排序

来自分类Dev

如何使用Java中的map集合按字符串中出现的次数对字符进行排序?

来自分类Dev

如何按出现次数对每一行进行排序?

来自分类Dev

Youtube API v3查询按一周观看次数排序

Related 相关文章

热门标签

归档