【问题标题】:Django query that filters on calculated fields, searching for character within string过滤计算字段的 Django 查询,在字符串中搜索字符
【发布时间】:2020-08-14 00:19:22
【问题描述】:

我有一个 django 模型,它描述了两个日期之间的周期性状态。它看起来像:

class OnCallCycle(models.Model):
    crew = models.ForeignKey(Crew, on_delete=models.CASCADE)
    start = models.DateField()
    end = models.DateField()
    cycle = models.CharField(max_length=255)

其中startend 是周期的包含开始和结束日期,cycle 是一个字符串,表示每天使用一个字符的待命状态周期。例如,如果您有一个 12 天的周期,其中前 6 天开启(由 P 表示),最后 6 天关闭(由 N 表示,cycle 看起来像:PPPPPPNNNNNN . 如果startend 之间的天数大于周期的长度,它会重复。因此,给定一个 OnCallCycle 实例,occ,可以计算给定日期的 on call 状态,@ 987654332@(已知介于startend之间)by:

delta = (d-occ.start).days
status = occ.cycle[delta % len(occ.cycle)]

有没有办法在给定日期d 的查询中执行此操作?我想做这样的事情:

active_cycles = OnCallCycle.objects.filter(
    start__lte=d,
    end__gte=d
).filter(
    # Find all OnCallCycles where the cycle status for date d is not 'N'
)

我正在为我的数据库使用 Postgres,如果这有什么改变的话。有什么想法吗?

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    您可以使用正则表达式过滤器来获取特定状态。 表达式应该类似于^.{8}P,其中 8 是位置,P 是您要查找的字母。

    不过,我建议将状态编码为位。正则表达式往往在数据库提供者和版本之间有所不同,这使得它们变得古怪。 如果您决定使用这些位,请检查: How to perform DB bitwise queries in Django?

    【讨论】:

    • Bits 不起作用,因为有多种状态(对于这个例子,我只是将它保留为 P 和 N,但还有其他几种状态)。我的另一个问题是:你的建议是什么——“周期”中的位置取决于周期的长度、开始日期和我们正在查找的日期。有没有办法在查询中进行增量/索引计算?
    • 不,您需要预先设置索引和状态并将它们传递给正则表达式。此外,如果您有多个状态,为什么不简单地删除该字段并添加一个日志表,您可以在其中存储执行?如果要检查状态字符串的长度,请检查:stackoverflow.com/questions/12314168/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多