【问题标题】:Django - How to query the most recent distinct rows before an effective date?Django - 如何在生效日期之前查询最近的不同行?
【发布时间】:2019-04-16 21:49:20
【问题描述】:

我有一个充满有效日期费率的模型。这些费率上值得注意的字段是nametypeeffective_daterate

我需要能够过滤修改器费率以仅获取特定类型和特定日期之前的费率。

ModifierRate.objects.filter(
                type=settings.MODIFIER_RATE_TYPES_TAX,
                effective_date__lte=date)

该查询可能返回具有相同nametype 的费率,因此我需要它们在这两个字段上有所不同。

.distinct('name', 'type')`

但是,如果有重复的名称和类型,我需要最新的。

.order_by('-effective_date')

毕竟我需要汇总这些对象的费率。

.aggregate(rate__sum=Coalesce(Sum('rate'), 0))['rate_sum']

如果我尝试将所有这些东西粉碎在一起,我会得到

    raise NotImplementedError("aggregate() + distinct(fields) not implemented.")
NotImplementedError: aggregate() + distinct(fields) not implemented.

我已经在谷歌上搜索了一段时间,有很多类似的问题使用 values_listannotate,但我认为这不是我想要的。

我如何获得某个日期之前在使用最新不同费率的字段名称和类型上不同的费率总和?

谢谢。

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    您可以使用 django Subquery expressions,详情请阅读链接。

    most_recent = ModifierRate.objects.filter(
        name=OuterRef('name'), 
    ).order_by(
        '-effective_date'
    )
    
    result = ModifierRate.objects.filter(
        type=settings.MODIFIER_RATE_TYPES_TAX,
        effective_date__lte=date
        pk=Subquery(most_recent.values('pk')[:1])
    ).aggragate(
        rate__sum=Coalesce(Sum('rate'), 0)
    )['rate_sum']
    

    【讨论】:

    • 我不会删除重复的类型和名称吗?以及如何确保被删除的重复项是旧的?
    • 谢谢,我会试一试并报告
    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多