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

2024-09-30 01:19:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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我有一个类似的东西:

^{pr2}$

我通过admin只定义了一个calculatorFarm(只有一个IP进行计算),并将其与两个不同的等式相关联。在

我期望发生的是:第一个等式看到calculatorFarm的client变量是None,因此第一次将它连接起来。第二个等式已经发现客户端不是None(connected),然后继续在中间添加作业。在

发生了什么:每次我调用startCalc方法,客户机都是None并尝试连接,服务器不允许这样做,所以我得到一个错误。在

我已经试过了: -保存所有模型自我保存()在连接客户端后在if中 -在init()方法中定义客户机变量


Tags: 方法模型selfnone客户端定义def作业
1条回答
网友
1楼 · 发布于 2024-09-30 01:19:37

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

我认为这不是正确的方法。退一步说,DjangoModel实例表示数据库中的一行,其行为由该行的列的值定义。这就是为什么模型实例相等(__eq__)是通过查看主键字段而不是对象id来定义的。试图强制对象相等会改变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)

我认为这样做比试图强制模型实例对象相等要干净得多。在

相关问题 更多 >

    热门问题