Django:具有嵌套模型的复杂按查询排序

Django:具有嵌套模型的复杂按查询排序,django,foreign-keys,sql-order-by,django-queryset,Django,Foreign Keys,Sql Order By,Django Queryset,我有以下三种型号 from django.db.models import Max from django.utils import timezone class Product(models.Model): name = models.CharField( blank=False, max_length=256 ) class TaskGroup(models.Model): name = models.CharField( blank

我有以下三种型号

from django.db.models import Max
from django.utils import timezone


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,
    )
我可以在date按任务
execute\u订购产品

Products.objects.annotate(
    last_task=Max('taskgroup__task__execute_at')
).order_by('-last_task')
但是,我只需要考虑比今天更大的第一个日期,即我需要一些类似

的东西。
Products.objects.annotate(
    last_task=('taskgroup__task__execute_at' >= timezone.now()).first()
).order_by('last_task')
因此,我需要按最接近的任务执行日期(即最接近当前日期)订购产品


我该怎么做?在一个查询中完成这项工作会很好。

因为DJANGO 2.0我们可以使用来实现这一点

以下行必须是“做你想做的事”:

from django.db.models import Min, Q

Products.objects.annotate(
    last_task=Min(
        'taskgroup__task__execute_at',
        filter=Q(taskgroup__task__execute_at__gte=timezone.now()
))).order_by('last_task')

我不需要过滤产品,我需要在日期按任务执行订购产品,其中日期为>=timezone.now()
@StaticName,要做到这一点,首先必须在时间=timezone.now()执行过滤
execute\u。然后,你可以通过“(TaskGypGypaskasiExuxTeItAt))< /COD>进行升序或<代码> OrthyTo(“TaskGypPypaskkasExePuthEtIAT”)下拉。@ ZelyyJun,我认为他需要第一个项目,从这个问题:我只需要考虑大于第一个日期。today@StaticName,如果您不需要筛选simple,请将其排除在外,并仅使用
…order\u by(“-taskgroup\uu task\uu execute\u at”).first()
。但是要获得大于或等于时区的项目。现在()您必须执行
filter()
。即使您执行了筛选,它也不起作用。因为最终产品是由
任务组uu任务u执行u在处订购的,所以过滤器在此查询中不起作用。