python - 是否可以对 OuterRef 表达式进行算术运算?

标签 python django django-models orm

我正在用 django 构建一个体验预订系统,我有以下模型。

class Experience(models.Model):
 name = models.CharField(max_length=20)
 capacity = models.IntegerField()

class Booking(models.Model):
 experience = models.ForeignKey(Experience)
 occupied = models.IntegerField()

每个体验都有名额限制,当用户进行预约时,会以已占用的人数添加到预约表中。现在我如何找到没有被完全占用的体验?

available_experiences = Experience.objects.all().exclude(id__in=Subquery(Booking.objects.filter(occupied__gt=OuterRef('capacity') - request_persons).values_list('experience', flat=True)))

此处,request_persons 是体验中所需的空缺人数。这不起作用并显示错误,例如 'ResolvedOuterRef' object has no attribute 'relabeled_clone'。是否可以像 F() 这样对 OutRef() 表达式进行算术运算?

在不添加 request_persons 的情况下,上面的代码有效。为什么不能向 OutRef() 表达式添加值?

注意:我的实际代码非常复杂,在不修改上述代码的整个结构的情况下获得答案真的很棒。

最佳答案

通过在 OuterRef() 引用的查询中直接执行算术运算,您可以解决此问题:

available_experiences = Experience.objects.annotate(
    total=models.F('capacity') - request_persons
).exclude(
    id__in=Subquery(Booking.objects.filter(
        occupied__gt=OuterRef('total')
    ).values_list('experience', flat=True))
)

如果您在不修改结构或使用 RawSQL().extra() 的情况下找到了另一种方法,请告诉我们!

关于python - 是否可以对 OuterRef 表达式进行算术运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48230771/

相关文章:

python - 如何在 Django 模板中进行数学运算?

Django另一个优化save()

django - 如何过滤 QuerySet 中的空名称或 NULL 名称?

python - 如何使用 SQLAlchemy、pydantic 和 FastAPI 处理聚合查询结果

python - 使用一对多关系在 Django 中创建 2 种不同的用户类型

python - 在 django 中发布后保留选中的复选框

python - Django 管理员 ListView : add CSS class for rows by field value

python - Django 过滤器排除外键

python - 根据相似的两列对 pandas 数据框进行排序,但如果另一列具有值,则其中一列将为 NaN

python - 如何从python字符串中删除连续的单字母字符