Python 如何设置相关的Django模型字段
我有以下简化的问题。假设我有两个Django模型,即(P)项目和(H)ourly,它存储项目的小时值 现在让我们假设这些实体之间存在简单的关系,例如: H.Y=2×H.X+P.PAR。 有没有一种优雅的方法来实现这一点?在何处放置帮助功能:Python 如何设置相关的Django模型字段,python,django,model,Python,Django,Model,我有以下简化的问题。假设我有两个Django模型,即(P)项目和(H)ourly,它存储项目的小时值 现在让我们假设这些实体之间存在简单的关系,例如: 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.Fore
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()
如果您不需要查询
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)
P类(models.Model):
PAL=浮点字段()
H类(型号.型号):
p=models.ForeignKey(p,on_delete.CASCADE)
x=浮动字段()
@财产
定义y(自我):
返回计算值(self.x,self.p.par)
因此,我们不将其存储在数据库中:在需要时对属性进行评估。因此,如果您有一个H
实例H
,那么H.y
将让Python计算该值并返回它
这样做的好处是我们避免了数据重复,因此不会出现三个变量之间的关系不满足的情况,我们还节省了内存,因为数据库表将更小
这种方法的一个问题是,由于没有显式存储值,因此不可能在
y
上查询(或者至少不需要一些技巧)。因此,我们无法轻松查询数据库中的所有H
s,例如y<0.5
。如果您不需要查询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)
P类(models.Model):
PAL=浮点字段()
H类(型号.型号):
p=models.ForeignKey(p,on_delete.CASCADE)
x=浮动字段()
@财产
定义y(自我):
返回计算值(self.x,self.p.par)
因此,我们不将其存储在数据库中:在需要时对属性进行评估。因此,如果您有一个H
实例H
,那么H.y
将让Python计算该值并返回它
这样做的好处是我们避免了数据重复,因此不会出现三个变量之间的关系不满足的情况,我们还节省了内存,因为数据库表将更小
这种方法的一个问题是,由于没有显式存储值,因此不可能在
y
上查询(或者至少不需要一些技巧)。因此,我们无法轻松查询数据库中的所有H
s,例如y<0.5
。您应该将所有带有业务逻辑的代码放在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创建对象后立即调用此函数。您应该将所有带有业务逻辑的代码放入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创建对象后立即调用此函数。您是否能够查询
y
?您是否能够查询y
?哇,这是一个快速响应。好的,我会调查的。谢谢!哇,这是一个快速的反应。好的,我会调查的。谢谢!