【问题标题】:Filter annotate When Case with foregin key使用外键过滤注释时的情况
【发布时间】:2019-09-16 23:14:33
【问题描述】:

我有 2 个模型:

class ServiceRequest(models.Model):
    post_time = models.DateTimeField(default=timezone.now)
    service = models.IntegerField(default=102)

class RequestSession(models.Model):
    request = models.ForeignKey(ServiceRequest)
    post_time = models.DateTimeField(default=timezone.now)

如果service 具有值102,它将具有一个或多个RequestSession

我有查询集获取所有ServiceRequest : ServiceRequest.objects.all()

我的问题是:如果service!=102,如何order_by post_time。如果service=102 我想按requestsession_set 中最大的post_time 排序?

我尝试了annotate,但我不知道如何在requestsession 中获得最大的post_time,然后

我尝试过的查询:

queryset.annotate(time_filter=Case( When(service_id=102, then=('requestsession_set__post_time')), default=Value('post_time'), output_field=DateTimeField(), ), ).order_by("-time_filter")

【问题讨论】:

    标签: django django-rest-framework django-queryset


    【解决方案1】:

    试试:

    When(service=102, then=Max('requestsession_set__post_time')),
    

    请注意,我还将 service_id 替换为 service,因为在您的示例中,service 只是一个 IntegerField

    另外,它应该是default='post_time',没有Value。见https://docs.djangoproject.com/en/2.2/ref/models/expressions/#value-expressions

    【讨论】:

    • then=Max('requestsession_set__post_time') 更改为 then=Max('requestsession__post_time') 即可。 Django 说 requestsession_set 不接受字段
    猜你喜欢
    • 1970-01-01
    • 2019-02-28
    • 2019-03-19
    • 2016-09-07
    • 2019-03-02
    • 2012-03-07
    • 2012-08-08
    • 2022-08-03
    • 1970-01-01
    相关资源
    最近更新 更多