Django:按多级反向查找排序

问题描述

Django:按多级反向查找排序

我有以下 3 个模型

class Product(models.Model):

    name = models.CharField(
        blank=False,max_length=256
    )


class TaskGroup(models.Model):
    name = models.CharField(
        blank=False,max_length=256
    )

    product = models.ForeignKey(
        Product,on_delete=models.CASCADE,null=False,blank=True
    )


class Task(models.Model):
    name = models.CharField(
        blank=False,max_length=256
    )

    task_group = models.ForeignKey(
        TaskGroup,blank=True
    )
    
    execute_at = models.DateField(
        blank=True
        null=True,)

我想获得 Productsexecute_at 日期之前订购的所有 Task。我怎样才能做到这一点? 是否可以使用单个查询来做到这一点?

一个产品可以有多个任务。但始终考虑较小的 execute_at 日期,即 最接近当前日期的日期。

解决方法

您可以通过 WITH N AS( SELECT N FROM (VALUES(NULL),(NULL),(NULL))N(N)),Tally AS( SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS I FROM N N1,N N2,N N3,N N4) SELECT T.I,CHAR(T.I) AS C,ROW_NUMBER() OVER (ORDER BY CHAR(T.I)) AS S FROM Tally T ORDER BY C; 字段的最大值.annotate(…) [Django-doc],然后使用以下命令排序:

created_at

您可以订购末尾没有相关 from django.db.models import Max Products.objects.annotate( last_task=Max('taskgroup__task__execute_at') ).order_by('-last_task') 的商品:

Task