2015-10-26 68 views
0

属性内我想知道哪个模型叫它。有没有办法做到这一点?如何知道哪个Django模型通过ForeignKey调用属性?

示例代码:

# 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的虚拟机名财产和执行代码:

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 

,然后寻找在虚拟机名财产child_instance属性:

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

但它没有奏效。

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

非常感谢您的帮助。

回答

1

如果只有一台服务器指向虚拟机服务器,则可以使用反向查找,例如,用related name.所以,如果ServerOne的ForeignKey的到VirtualMachineServer具有相关名称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()

或者,如果VirtualKachineServer上有多个ForeignKeys对象,那么您可以只添加一个参数到virtual_machine,该参数指定对象是指什么对象。然后你可以采取相应的行动例如:

server_one.virtual_machine_server.virtual_machine(server_one) 
相关问题