如何设置相互关联的Django模型字段

时间:2018-02-01 13:35:42

标签: python django model

我有以下简化问题。假设我有两个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()

2 个答案:

答案 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创建对象后立即调用此函数。