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

2024-10-02 18:25:43 发布

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

在属性内部,我想知道调用它的是哪个模型。有办法吗

示例代码:

# 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作为外键。我想在ServerOne或ServerTwo上调用VirtualMachineseServer的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属性中查找子_实例属性:

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

但它不起作用

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

提前感谢您的帮助


Tags: selfgetmodel属性servermodelsvirtualvm
1条回答
网友
1楼 · 发布于 2024-10-02 18:25:43

如果只有一台服务器指向虚拟机服务器,则可以使用反向查找,例如使用related name.。因此,如果ServerOne的ForeignKey to VirtualMachine server具有相关名称server_one,而ServerTwo的ForeignKey具有server_two,则可以按照

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

ForeignKeys还自动具有通过附加后缀_set创建的相关名称,例如VirtualMachineServer.serverone_set.all()

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

server_one.virtual_machine_server.virtual_machine(server_one)

相关问题 更多 >