如何知道哪个Django模型通过ForeignKey调用属性?

时间:2015-10-26 23:49:31

标签: python django django-models

在该属性中,我想知道哪个模型正在调用它。有没有办法做到这一点?

示例代码:

# Model One
class ServerOne(models.Model):

    user = models.ForeignKey(User)
    virtual_machine_server = models.ForeignKey(VirtualMachineServer)

# Model Two
class ServerTwo(models.Model):

    virtual_machine_server = models.ForeignKey(VirtualMachineServer)

# Model Three
class VirtualMachineServer(models.Model):

    @property
    def virtual_machine(self):
        # Execute the code based on which model 
        # is calling this property

        return vm

ServerOne和ServerTwo都将VirtualMachineServer作为ForeignKey。我想在ServerOne或ServerTwo上调用VirtualMachineServer的virtual_machine属性,并根据调用它的模型执行代码

示例:

server_one = ServerOne.objects.get(pk=1)
vm = server_one.virtual_machine_server.virtual_machine

server_two = ServerTwo.objects.get(pk=2)
vm = server_two.virtual_machine_server.virtual_machine

我尝试在ServerOne和ServerTwo中创建自定义管理器:

class ServerOneManager(models.Manager):

    def get_query_set(self):
        servers = super(ServerOneManager, self).get_query_set()
        for server in servers:
            server.virtual_machine_server.child_instance = vm

        return servers

然后在virtual_machine属性中查找child_instance属性:

@property
def virtual_machine(self):
    if not hasattr(self, "child_instance"):
        raise InstanceIsNotSetException()

但它没有用。

注意:child_instance不在数据库中,它只是动态创建的属性。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果只有一个服务器指向虚拟机服务器,则可以使用反向查找,例如使用related name.因此,如果ServerOne的VirtualKachineServer的ForeignKey具有相关名称server_one而ServerTwo的ForeignKey具有server_two,那么您可以执行以下操作: / p>

if self.server_one:
    # Do something
elif self.server_two:
    # Do something else
else:
    # No server!

ForeignKeys还会自动添加后缀_set创建的相关名称,例如VirtualMachineServer.serverone_set.all()

或者,如果VirtualKachineServer有多个具有ForeignKeys的对象,那么您只需向virtual_machine添加一个参数即可指定引用它的对象。然后你可以采取相应行动。例如:

server_one.virtual_machine_server.virtual_machine(server_one)