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,
)
我想获取在 Task
的 execute_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>)
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,
)
我想获取在 Task
的 execute_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>)