我在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)
答案 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)
“这是一种将业务逻辑保存在一个地方的有价值的技术 - 模型。”