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

我想获取产品的任务组并通过 execute_at 为每个任务组排序任务。 我可以通过

获取所有任务组和产品的所有任务
product = Product.objects.first()
task_groups = product.taskgroup_set.all()

task_groups 包含所有组和每个组的所有任务。 我也可以做一些类似 task_groups[0].task_set.all().order_by('execute_at') 的事情。 我不知道如何将这些查询放在一起,并在单个查询中按 execute_at 对每个组的任务进行排序。

解决方法

您可以使用 Prefetch() objects 并为预取对象指定查询集(这也可以提高效率,因为将对数据库进行较少的查询):

from django.db.models import Prefetch


product = Product.objects.filter(pk=some_pk).prefetch_related(
    Prefetch(
        'taskgroup_set__task_set',queryset=Task.objects.order_by('execute_at')
    )
).get() # Change `.filter(pk=some_pk)` as per your implementation