【问题标题】:Add a django model method result as a field in an ORM query在 ORM 查询中添加 django 模型方法结果作为字段
【发布时间】:2021-09-08 21:48:09
【问题描述】:

我用两种方法创建了一个 djngo 模型来做一些类似的事情:

class Scaling(models.Model):
    id = models.AutoField(primary_key=True)
    description = models.TextField(default='', verbose_name="Description", null=True, blank=True)
    input_low = models.FloatField()
    input_high = models.FloatField()
    output_low = models.FloatField()
    output_high = models.FloatField()
    limit_input = models.BooleanField()

    def __str__(self):
        if self.description:
            return self.description
        else:
            return str(self.id) + '_[' + str(self.input_low) + ':' + \
                   str(self.input_high) + '] -> [' + str(self.output_low) + ':' \
                   + str(self.output_low) + ']'

    def scale_value(self, input_value):
        input_value = float(input_value)
        if self.limit_input:
            input_value = max(min(input_value, self.input_high), self.input_low)
        norm_value = (input_value - self.input_low) / (self.input_high - self.input_low)
        return norm_value * (self.output_high - self.output_low) + self.output_low

    def scale_output_value(self, input_value):
        input_value = float(input_value)
        norm_value = (input_value - self.output_low) / (self.output_high - self.output_low)
        return norm_value * (self.input_high - self.input_low) + self.input_low

好的,现在我将在复杂的 django 查询中使用我的实例方法计算作为普通字段,例如:

 var_results = VarsResults.objects.filter(
    id_res__read_date__range=(start_d, end_d),
    id_res__proj_code=pr_code,
    var_id__is_quarterly=False
).select_related(
    "id_res",
    "var_id",
    "scaling_id"
).values(
    "id_res__read_date",
    "id_res__unit_id",
    "id_res__device_id",
    "id_res__proj_code",
    "var_val",
    <scale_output_value(scaling instance_id)>
)

如何使用模型方法返回值作为查询集中的列?

提前非常感谢 曼努埃尔

【问题讨论】:

标签: django django-models django-orm


【解决方案1】:

我有一些想法可以解决这个问题。

其中一个正在使用@property 装饰器。 在这种情况下, scale_output_value 将仅作为模型的属性起作用。这样做的缺点是 scale_output_value 的值不会存储在数据库中(在模型表上)。但可以通过调用模型实例或在 Serializers 字段中访问。

@property
def scale_output_value(self, input_value):
        input_value = float(input_value)
        norm_value = (input_value - self.output_low) / (self.output_high - self.output_low)
        return norm_value * (self.input_high - self.input_low) + self.input_low

另一种方法是覆盖模型的保存方法。 将正常声明字段。

scale_value = models.FloatField()

def save(self, *args, **kwargs):
    #.... do your math here
    #.... self.scale_value....
    super(Scaling, self).save(*args, **kwargs)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-02
    • 2011-10-21
    • 2021-12-19
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多