django - 在 Django 模型中设置局部变量

标签 django django-models

我有以下模型:

class MeasurementParameter(models.Model):    
    tolerance = models.FloatField()
    set_value = models.FloatField()

    tol_low = None
    tol_high = None

    def tolerance_band(self):

        tol = self.set_value * self.tolerance/100

        self.tol_high = self.set_value + tol
        self.tol_low = self.set_value - tol

        print self.tol_low

        return self.tol_high, self.tol_low

我希望使用 tolerance_band 方法设置计算出的局部变量 tol_low 和 tol_high。

该模型与另一个名为 Product 的模型具有多对多关系。

class Product(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=1000)
    parameters = models.ManyToManyField(MeasurementParameter, related_name='measurement')

    def calc_all_tol_bands(self):

        for parameter in self.parameters.all():
            hi, lo = parameter.tolerance_band()

    def __str__(self):
        return self.name

所以在我看来,我尝试通过以下方式计算所有公差带:

product.calc_all_tol_bands()

但是,如果我尝试获取局部变量:

product.parameters.all()[0].tol_low

我一直都没有。

我需要做什么才能在 MeasurementParameter 模型中设置计算值?

约翰。

最佳答案

这是预期的行为。当你评估

product.parameters.all()[0]

这意味着您进行数据库提取。所以 Django 将获取这些参数中的第一个。由于 tol_lowtol_high持久化的(不存储在数据库中),这意味着它将回退到类属性,即

此处的计算相当简单,所以我建议您将这些转换为 properties [Python-doc] :

class MeasurementParameter(models.Model):    
    tolerance = models.FloatField()
    set_value = models.FloatField()

    <b>@property</b>
    def tol_low(self):
        return self.set_value * (100-self.tolerance)/100

    <b>@property</b>
    def tol_high(self):
        return self.set_value * (100+self.tolerance)/100

    def tolerance_band(self):
        return self.tol_high, self.tol_low

因此,我们将在必要时评估该属性。这更稳健:如果您更改对象的 toleranceset_value,则 tol_lowtol_high 该对象将有所不同。因此,没有复杂的代码来更新相关更新的值。 calc_all_bands 也不是必需的,因为计算只是在请求时完成。

请注意,您不能在 Django ORM 过滤器等中使用属性。在这种情况下,您可以将属性编码为查询表达式并使用这些注释查询集。

关于django - 在 Django 模型中设置局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54216257/

相关文章:

python - 如何按相关对象计数对查询集进行排序?

django - 使用具有多对多字段的 Django F 表达式

python - 属性错误 : 'User_Profile' object has no attribute '__name__'

python - 名称错误 django send_mail

mysql - 故意得到 "MySQL server has gone away"错误

python - Django Celery 周期性任务示例

Django - 如何将 InMemoryUploadedFile 转换为 ImageField 的 FieldFile?

python - Django模型无法调用应用程序模块方法

python - django rest framework,order_by 来自 serializers.py 文件的 JSON

django - 如何更新 Django 中的列数据类型