Django:通过嵌套模型查询的复杂顺序
Django: complex order by query with nested models
我有以下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,
on_delete=models.CASCADE,
null=False,
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')
所以我需要在最近的任务 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')
我有以下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,
on_delete=models.CASCADE,
null=False,
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')
所以我需要在最近的任务 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')