我有以下简化问题。假设我有两个Django模型,即(P)项目和(H)项目,它们存储项目的每小时值。
现在我们假设这些实体之间存在简单的关系,例如: H.y = 2 * H.x + P.par。 有没有一种优雅的方式来实现这个?在哪里放置帮助功能:
def calc_y(x, par):
return 2*x+par
class P(models.Model):
par = FloatField()
class H(models.Model):
p = models.ForeignKey(P, on_delete.CASCADE)
x = FloatField()
y = FloatField()
答案 0 :(得分:2)
如果您不需要查询y
(仅获取值),我们可以将其设为属性:
class P(models.Model):
par = FloatField()
class H(models.Model):
p = models.ForeignKey(P, on_delete.CASCADE)
x = FloatField()
@property
def y(self):
return calc_y(self.x, self.p.par)
因此我们不将存储在数据库中:在需要时评估属性。因此,如果您有一个H
实例h
,那么h.y
将让Python评估该值并将其返回。
这样做的好处是我们避免了数据重复,因此不能满足三个变量之间的关系,我们也节省了内存,因为数据库表会更小。
这种方法的一个问题是,由于未明确存储该值,因此无法查询y
(或者至少没有一些技巧)。因此,我们无法轻松查询数据库中的所有H
,例如y < 0.5
。
答案 1 :(得分:1)
您应该将所有带有业务逻辑的代码放在Django应用程序的services.py
中。
例如,你的情况应该是,
from .models import H, P
def calculate_y(x, par):
obj = H.objects.get(x=x) # if x is unique else use id
obj.y = 2 * x + par
obj.save(update_fields['y'])
您可以在为H创建对象后立即调用此函数。