【问题标题】:Mathematical Operations on Django AnnotationsDjango Annotations 上的数学运算
【发布时间】:2011-03-10 11:14:23
【问题描述】:

我有一个定义 TimeSlot 的 Django 模型。每个 TimeSlot 可以容纳一定数量的用户 (TimeSlot.spots)。每个 TimeSlot 也已经拥有一定数量的用户(多对多字段,TimeSlot.participants

当我传递给向用户显示可用 TimeSlot 的模板时,我使用 TimeSlot.objects.annotate(Count('participants')) 进行注释,这将 TimeSlot 当前持有的用户数提供为 participants__count

但是,我真正想要的是剩余的点数,容量 (TimeSlot.spots) 减去当前持有的数量 (participants__count)。如何使用这个新数字注释另一个字段,以便将其传递给模板?

【问题讨论】:

标签: django django-models django-templates


【解决方案1】:

注解仍然不可能(尽管它计划在 Django 中实现)。但是您可以使用.extra() 查询来做到这一点。有关详细信息,请参阅我的 answer 到另一个问题。

更新:

基本上,您需要这样的查询:

items = MyModel.objects.extra(
    select = {'variance': 'Model.someField - SUM(relatedModel__someField)'},
)

【讨论】:

    【解决方案2】:

    仅使用注释是不可能的。我会在执行注释的模型上创建一个方法,然后从您的 TimeSlot.spots 值中减去它。这将使用更多的数据库查询,但这是您唯一的选择。或者我猜你可以直接使用原始 SQL...

    【讨论】:

    • 谢谢,我担心可能是这种情况。我认为我最终要做的是在TimeSlot.participants 上设置ManyToManyManager,这样每当它添加一个人时,它就会减少TimeSlot.spots,,这有点不那么优雅,但从长远来看肯定更便宜。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 2019-10-16
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    相关资源
    最近更新 更多