微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django:按嵌套模型查询的复杂顺序

如何解决Django:按嵌套模型查询的复杂顺序

我有以下 3 个模型

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,blank=True
    )
    
    execute_at = models.DateField(
    blank=True
    null=True,)

我可以按任务 execute_at 日期订购产品。

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

所以我需要按最接近的 Task execute_at 日期订购产品,即最接近当前日期。

我该怎么做?最好在单个查询中完成。

解决方法

DJANGO 2.0 开始,我们可以使用 filter argument 来实现这一点。

下面这行必须做你想做的:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。