Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django模型每个外键一个实例_Python_Django_Django Models - Fatal编程技术网

Python Django模型每个外键一个实例

Python Django模型每个外键一个实例,python,django,django-models,Python,Django,Django Models,我有一个Django类,该类负责管理通过API将一些作业发送到服务器进行计算,然后返回结果(使用一个信号指示作业已完成,可以获取结果) 假设我们有这样一个方程模型: class equation(models.Model): calculator = ForeignKey(calculatorFarm) def calculationFinished(self, sender, **kwargs): print('result is done!: '+ kwar

我有一个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')
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)
另一方面,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中的self.save()保存所有模型 -在init()方法中定义客户机变量如果外键相同,如何强制calculatorFarm成为完全相同的对象

我认为这不是正确的方法。退一步,Django
Model
实例表示数据库中的一行,其行为由该行的列的值定义。这就是为什么通过查看主键字段而不是对象ID来定义模型实例相等(
\uuuu eq\uuu
)。试图强制对象相等将改变ORM的语义

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

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')
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)

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

研究这一点时,我注意到,如果使用相同的计算器外键获取两个不同的方程模型,则语句a.calculator为b.calculator返回False,因此django正在创建calculatorFarm的两个实例(即使它具有相同的外键。如果外键相同,我如何强制calculatorFarm成为完全相同的对象?太好了!非常感谢!现在它正在使用静态方法管理连接的类。)