首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将范围的一部分注释为新字段

将范围的一部分注释为新字段
EN

Stack Overflow用户
提问于 2018-06-26 22:10:03
回答 1查看 413关注 0票数 1

因此,我们在预订模型中使用DateTimeRangeField来表示开始和结束。这样做的理由可能不是很好,-separate的开始和结束字段在事后可能会更好-但我们现在已经进行了一年多,没有回头路了。

除了我只需要在相关模型的查询上注释结束日期时间之外,一般情况下一切都很好。而且我也搞不懂语法。

这里有一个小玩具示例,我想要一个员工列表,上面标注了他们最后一次预订的结束日期。

代码语言:javascript
复制
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') (或其他)。这基本上就是我在这里想要做的。

EN

回答 1

Stack Overflow用户

发布于 2018-06-27 20:38:19

多亏了IRC中的一些帮助,你可以直接使用RangeStartsWith和RangeEndsWith模型转换类。这些内容通常只是注册来为您提供对范围值的__startswith筛选器访问权限,但它们可以直接拉回值。

在我的示例中,这意味着只需稍微修改注释:

代码语言:javascript
复制
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])))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51044966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档