Django模型每个外键的单个实例

时间:2014-08-07 13:45:59

标签: python django django-models

我有一个Django类,它应该管理通过API将一些作业发送到服务器进行计算,然后返回结果(使用信号表示作业完成并且可以获得结果)。

假设我们有一个这样的方程模型:

class equation(models.Model):
    calculator = ForeignKey(calculatorFarm)

    def calculationFinished(self, sender, **kwargs):
        print('result is done!: '+ kwargs['result'])

    def calculate(self):
        calculatorFarm.calculationDone.connect(self.calculationFinished)
        self.calculator.startCalc('2+2')

另一方面,calculatorFarm我有以下内容:

import externalAPI
class calculatorFarm(models.Model):
    serverAddr = model.GenericIPAddressFioeld()
    calculationDone = Signal(providing_args=['result'])
    client = None

    def on_update(self, notification):
        if notification.mode == notification.JOB_FINISHED:
            self.calculationDone.send(sender=self.__class__, result=notification.result)

    def startCalc(self, equation):
        if self.client is None:
            self.client = externalAPI.connect(serverAddr)
        return self.client.add_calculation(equation, self.on_update)

我只通过管理员定义一个calculatorFarm(只有一个IP进行计算)并将其与两个不同的方程式相关联。

我期望发生的是:第一个等式看到calculatorFarm的客户端变量是None,因此第一次连接它。第二个等式已经发现客户端不是None(已连接)并继续立即添加作业。

发生了什么:每当我调用startCalc方法时,客户端为None并尝试连接,服务器不允许这样做,所以我收到错误。

我已经尝试过了: - 在我连接客户端后,在if中保存所有模型with self.save() - 在 init ()方法

中定义客户端cvariable

1 个答案:

答案 0 :(得分:1)

如果外键相同,我如何强制calculatorFarm成为完全相同的对象?

我认为这不是正确的做法。稍微退一步,Django Model实例意味着表示数据库中的一行,其行为由该行的列的值定义。这就是为什么通过查看主键字段而不是对象id来定义模型实例相等性(__eq__)的原因。试图强制对象相等会改变ORM的语义。

但实际上,这不是Django问题。您要做的就是缓存现有的服务连接,这可以使用多种设计模式之一来完成。直截了当的方法可能如下所示:

class ServiceConnector(object):
    connections = {}

    @staticmethod
    def get_connection(ip):
        if ip not in ServiceConnector.connections:
            ServiceConnector.connections[ip] = externalAPI.connect(ip)

        return ServiceConnector.connections[ip]

class calculatorFarm(models.Model):
    serverAddr = model.GenericIPAddressField()

    def startCalc(self, equation):
        client = ServiceConnector.get_service(self.serverAddr)
        return client.add_calculation(equation, self.on_update)

我认为这样的事情会比试图强制模型实例对象相等更清晰。