【问题标题】:How to chain Django querysets and sort the result by different fields of those querysets如何链接 Django 查询集并按这些查询集的不同字段对结果进行排序
【发布时间】:2020-10-24 12:45:12
【问题描述】:

我需要这个的原因是按时间倒序显示活动线程。我通过将多个对象链接成一个然后在一个地方显示来实现这一点。 目前我有:

contacts = User.contact_created_by.all()
companies = User.company_created_by.all()
tasks = User.tasks_created_by.filter(isComplete=True)
activity = sorted(
       chain(contacts, companies, tasks),
       key=lambda instance: instance.created_on, reverse=True)

但我需要在结果对象中按“completion_date”而不是“created_on”日期对任务进行排序。

我试过这个用于 lambda 函数:

key=lambda instance: instance.complete_date if (isinstance(instance, Task)) else instance.created_on, reverse=True)

但由于“联系人”和“公司”模型没有“完成日期”字段,因此出现错误。

基本上问题是组合不同的对象并按不同的字段(但相同的类型 - 日期!)对它们进行排序。例如,我进一步计划将“event”对象添加到需要在活动线程中显示的项目中,并带有某种类型的“event_date”。

所以结果将如下所示(按时间倒序排列):

Today:

-event X happened
-contact X created
-task X completed

Yesterday:

-task Y completed
-company X created

The day before yesterday:
-company Y created

【问题讨论】:

    标签: django sorting django-queryset django-filter


    【解决方案1】:

    试试这个:sort values with None

    sorted(
        instances, 
        key=lambda i: (getattr(i, 'complete_date', None) is None, getattr(i, 'complete_date', None))
    )
    

    【讨论】:

    • 抱歉这么久才回复。我最终创建了一个名为“Activity”的完全独立的模型,因为我的方法不可扩展。还是谢谢你。
    猜你喜欢
    • 2020-08-16
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 2014-04-12
    相关资源
    最近更新 更多