我正在用 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/