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在处订购的,所以过滤器在此查询中不起作用。