【问题标题】:Django: order by multi-level reverse look upDjango:按多级反向查找排序
【发布时间】:2021-06-12 13:04:00
【问题描述】:

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,
    )

我想获取所有execute_at 日期Task 排序的Products。我怎样才能做到这一点? 是否可以使用单个查询来执行此操作?

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

【问题讨论】:

  • 如果有多个Task怎么办?
  • 您的Task 模型还没有created_at 日期字段?
  • 请检查更新
  • 这不是最小的,而是最大的,因为随着时间的推移,时间戳会增加。

标签: django foreign-keys sql-order-by django-queryset


【解决方案1】:

你可以.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 的商品,最后带有:

from django.db.models import F, Max

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

【讨论】:

  • 您的查询是正确的,但有没有办法在没有任务的情况下订购产品?但是如果有任何任务,那么任务最低的产品execute_at应该首先显示。
  • @StaticName: 最低的?位,意思是“最古老的”。请注意,时间戳会随时间增加。但是您可以使用nulls_last=True 将没有相关Task 的项目设置为最后,请参阅编辑。
猜你喜欢
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
  • 2011-10-01
  • 2014-02-16
  • 1970-01-01
  • 2016-09-15
  • 2013-02-24
相关资源
最近更新 更多