Django:通过多级反向查找排序

Django: order by multi-level reverse look up

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,
        on_delete=models.CASCADE,
        null=False,
        blank=True
    )
    
    execute_at = models.DateField(
        blank=True
        null=True,
    )

我想获取在 Taskexecute_at 日期之前订购的所有 Products。我怎样才能做到这一点? 是否可以使用单个查询来执行此操作?

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

您可以.annotate(…) [Django-doc]created_at字段的最大值,然后排序:

from django.db.models import Max

Products.objects.annotate(
    <b>last_task=Max('taskgroup__task__execute_at')</b>
).order_by(<b>'-last_task'</b>)

您可以在末尾订购没有相关 Task 的商品:

from django.db.models import F, Max

Products.objects.annotate(
    last_task=Max('taskgroup__task__execute_at')
).order_by(<b>F('last_task').desc(nulls_last=True)</b>)