python - 组合和排序查询集

标签 python django django-queryset

我正在尝试将额外的模型添加到有序的项目列表中,并将列表中的所有内容按每个模型上的日期字段排序。

我以为我可以通过链接每个查询集并用键对它们进行排序来破解它;

def get_ordering(obj):
    """
    Helper to get the 'order_by' field for the paginated latest news list.
    :param obj: Object used in the paginated latest news
    :type obj: django.db.model
    :return: ordering field
    :rtype: str
    """
    if isinstance(obj, LatestNews):
        return '-publish_date'
    else:
        return '-date_created'


def build_paginated_latest_news(request, instance=None, placeholder=None):

    paginated_page_no = get_page_no(request)
    paginated_page_items = get_page_items(request)
    latest_news = LatestNews.cached.published_items(
        request, instance, placeholder
    )
    query = published_items(request)
    videos = VideoGalleryPlugin.objects.filter(query)
    audio = Audio.objects.filter(query)

    obj_list = sorted(
        chain(latest_news, videos, audio),
        key=lambda instance: get_ordering(instance)
    )
    paginator = Paginator(obj_list, paginated_page_items)

但最终呈现的列表显示为视频、音频、latest_news,这甚至不是我将它们链接在一起的顺序。

使用 sorted() 应用这样的键来组合查询集是否正确?

最佳答案

get_ordering() 中,您应该返回排序函数将使用的值:

def get_ordering(obj):
    if isinstance(obj, LatestNews):
        return obj.publish_date
    else:
        return obj.date_created

然后在你看来:

obj_list = sorted(
    chain(latest_news, videos, audio),
    key=get_ordering, # intermediate lambda is not needed here
    reverse=True
)

关于python - 组合和排序查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29535036/

相关文章:

python - 在 Django Haystack 的 SearchQuerySet 中过滤空白的 CharField

python - 减少 django 项目的 QuerySet 数量

Django通过子模型计数(一对多关系)对父模型进行排序

python - 在同一层次结构中的不同类之间使用 Django ORM 语法中的 UNION

Django 查询 WHERE 1 IN (column1, column2)

python - MySQL + python 表 FETCH 模块

django - 如何在 Django 中使用 Tornado 工作?这是一个很好的解决方案吗?

django - 过滤然后遍历嵌套的Django模型

python - 仅沿一个轴平滑二维阵列

Python,循环读取Excel文件表,更改标题行号