因此,我们在预订模型中使用DateTimeRangeField来表示开始和结束。这样做的理由可能不是很好,-separate的开始和结束字段在事后可能会更好-但我们现在已经进行了一年多,没有回头路了。
除了我只需要在相关模型的查询上注释结束日期时间之外,一般情况下一切都很好。而且我也搞不懂语法。
这里有一个小玩具示例,我想要一个员工列表,上面标注了他们最后一次预订的结束日期。
class Booking(models.Model):
timeframe = DateTimeRangeField()
employee = models.ForeignKey('Employee')
sq = Booking.objects.filter(employee=OuterRef('pk')).values('timeframe')
Employee.objects.annotate(last_on_site=Subquery(sq, output_field=DateTimeField()))这不起作用,因为带注解的值是范围,而不是单个值。我已经尝试了一堆修饰符(例如__1 .1,但都不起作用)。
有没有办法只获取一个值?我想您可以模拟这一过程,而不需要复杂的子查询,只需执行简单的值查找即可。Booking.objects.values('timeframe__start') (或其他)。这基本上就是我在这里想要做的。
发布于 2018-06-27 20:38:19
多亏了IRC中的一些帮助,你可以直接使用RangeStartsWith和RangeEndsWith模型转换类。这些内容通常只是注册来为您提供对范围值的__startswith筛选器访问权限,但它们可以直接拉回值。
在我的示例中,这意味着只需稍微修改注释:
from django.contrib.postgres.fields.ranges import RangeEndsWith
sq = Booking.objects.filter(employee=OuterRef('pk')).values('timeframe')
Employee.objects.annotate(last_on_site=RangeEndsWith(Subquery(sq[:1])))https://stackoverflow.com/questions/51044966
复制相似问题