Django - 什么是最佳实践 - 计算字段值

时间:2015-11-02 17:04:36

标签: python django

我在Django中有一个模型,它有三个字段,这些字段是根据一个字段的值计算的。特别是其中一个字段的值将要求查询另一个表中的记录(我将使用最后十个值的平均值)。

我不确定在模型类中,在模型中,在视图中放置此功能的最佳位置在哪里?

任何建议都将不胜感激 - 谢谢

该模型如下所示:

class slide_library(models.Model):

    slide_name = models.Charfield(max_length = 6, primary_key = True)
    reference_value = models.FloatField(default= '0')
    last_mean = models.FloatField(default= '0')
    esd = models.FloatField(default= '0')
    criteria = models.Charfield(max_length= 10)

3 个答案:

答案 0 :(得分:2)

您可以避免使用信号(您应该使用信号作为最后一个资源),覆盖模型保存方法并在存储实例之前计算您的值。

class slide_library(models.Model):

    slide_name = models.Charfield(max_length = 6, primary_key = True)
    reference_value = models.FloatField(default= '0')
    last_mean = models.FloatField(default= '0')
    esd = models.FloatField(default= '0')
    criteria = models.Charfield(max_length= 10)

    #Overriding
    def save(self, *args, **kwargs):
        #set here your calculated attributes
        self.my_stuff = 'something I want to save in that field'
        super(slide_library, self).save(*args, **kwargs)

此外,如果它们是计算属性,请考虑如果您确实需要将其存储在DB中,则可以动态计算。

您可以使用装饰器@cached_property,正如django docs所说

  

@cached_property装饰器使用a缓存方法的结果   单一的自我论证作为财产。缓存的结果将保持为   只要实例这样做,所以如果实例传递并且   随后调用函数,将返回缓存的结果。

     

考虑一个典型案例,其中视图可能需要调用模型   在放置模型实例之前执行某些计算的方法   进入上下文

from django.utils.functional import cached_property

class slide_library(models.Model):

    slide_name = models.Charfield(max_length = 6, primary_key = True)
    reference_value = models.FloatField(default= '0')
    last_mean = models.FloatField(default= '0')
    esd = models.FloatField(default= '0')
    criteria = models.Charfield(max_length= 10)

    @cached_property
    def derivate_field_1(self):
        #Here goes all ur stuff to calculated your field
        value = ....your calculated value
        return value 

答案 1 :(得分:1)

嗯,因为这是一个基于最佳做法的问题,我认为您正在寻求建议。

如果我是你,我会把它放在模特中的signal上:

P.D。:通过最佳实践,在camelcase SlideLibrary中调用您的模型

from django.db.models.signals import pre_save

def calculate_values(sender, instance, *args, **kwargs):

    # Logic here to calculate fields

class SlideLibrary(models.Model):

    slide_name = models.Charfield(max_length = 6, primary_key = True)
    reference_value = models.FloatField(default= '0')
    last_mean = models.FloatField(default= '0')
    esd = models.FloatField(default= '0')
    criteria = models.Charfield(max_length= 10)

pre_save.connect(calculate_values, sender=SlideLibrary)

答案 2 :(得分:1)

他们应该在模型中作为方法(函数),文档https://docs.djangoproject.com/en/1.8/topics/db/models/#model-methods,在下面复制他们的示例

from django.db import models

class Person(models.Model):
  first_name = models.CharField(max_length=50)
  last_name = models.CharField(max_length=50)
  birth_date = models.DateField()

  def baby_boomer_status(self):
    "Returns the person's baby-boomer status."
    import datetime
    if self.birth_date < datetime.date(1945, 8, 1):
        return "Pre-boomer"
    elif self.birth_date < datetime.date(1965, 1, 1):
        return "Baby boomer"
    else:
        return "Post-boomer"

  def _get_full_name(self):
    "Returns the person's full name."
    return '%s %s' % (self.first_name, self.last_name)
  full_name = property(_get_full_name)

“这是一种将业务逻辑保存在一个地方的有价值的技术 - 模型。”