为了账号安全,请及时绑定邮箱和手机立即绑定

attrgetter:按对象属性排序时更改默认顺序

attrgetter:按对象属性排序时更改默认顺序

互换的青春 2021-09-14 21:22:37
您可以尝试使用条件语句:from django.db.models import Count, Max, Case, When, FloatField, FMyObject.objects.all().annotate(count=Count('audits')).annotate(    max=Case(        When(count=0, then=F('weight')),        When(count__gt=0, then=Max('audits__auditor_weight')),        output_field=FloatField()        )    )).order_by('max')
查看完整描述

1 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

我在这里找到了答案,他提供了一个通用的解决方案,可以将属性作为参数传入。关键是使用lambda函数定义密钥。


我的代码现在如下所示。请注意输入检查以验证 (1) 列表不为空以及 (2) 感兴趣的属性是否确实属于str可以使用casefold().


def sort_hits_by_attribute(hits, attribute, backwards=False):

    """Takes a lits of hits and sorts them by some attribute.


    For instance, group duplicate relation hits together by sorting

    on full_statement.

    """


    if hits:

        if isinstance(attrgetter(attribute)(hits[0]), str):

            return sorted(hits, 

                key = lambda A: attrgetter(attribute)(A).casefold(), 

                reverse = backwards)

        else:

            return sorted(hits, 

                key = attrgetter(attribute), 

                reverse = backwards)

我没有将此问题标记为重复,因为引用的问题的最喜欢的答案不是特别适合这种情况的答案。


查看完整回答
反对 回复 2021-09-14
  • 1 回答
  • 0 关注
  • 226 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信