【问题标题】:Django: order set queriesDjango:订单集查询
【发布时间】:2021-07-02 04:26:19
【问题描述】:

我有以下 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 为每个任务组订购任务。 我可以通过

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 2023-03-10
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多