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

您可以尝试使用条件语句:


from django.db.models import Count, Max, Case, When, FloatField, F


MyObject.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')


互换的青春
浏览 236回答 1
1回答

潇潇雨雨

我在这里找到了答案,他提供了一个通用的解决方案,可以将属性作为参数传入。关键是使用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)我没有将此问题标记为重复,因为引用的问题的最喜欢的答案不是特别适合这种情况的答案。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python