AttributeError: 'FloatField' 对象在 OneToOneField 模型字段上使用 F 函数时没有属性 'model' 错误

问题描述

我的模型定义看起来像这样并且存在一对一关系

SELECT * 
FROM rooms r
WHERE room_id NOT IN (SELECT room_id 
                     FROM room_bookings 
                     WHERE '2021/04/27' BETWEEN check_in_date AND check_out_date
                        OR '2021/04/30' BETWEEN check_in_date AND check_out_date) 
  AND room_size <> 'Double'

以下来自view_api.py,self.queryset基于Rocket.objects.all()

class Rocket(BaristaBase):

    name = models.CharField(
        max_length=256,blank=True,null=False,unique=True,)

    my_volume = models.IntegerField(
        default=0,)

class RocketMetrics(EspBase):

    rocket = models.OneToOneField(
        "Rocket",on_delete=models.CASCADE,null=True,related_name="metrics"
    )

    helpful_count = models.IntegerField(
        default=0,)

上面使用 FloatField() 来转换输出会引发以下错误。

    self.queryset = self.queryset.annotate(percent_unhelpful=Case(
       When(total_actions=0,then=0.0),default=F('metrics__helpful_count') * 100.0 / F('total_actions'),output_field=FloatField()))

如果我有 F 函数只是引用基本模型的字段,例如 Rocket 模型本身中的 my_volume,这当然不会发生。例如,default=F('my_volume') * 100.0 / F('total_actions')。但仅适用于对基于 OneToOneField 的引用的 F 引用,如上所述。这是注释的错误或限制吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)