在该属性中,我想知道哪个模型正在调用它。有没有办法做到这一点?
示例代码:
# 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不在数据库中,它只是动态创建的属性。
提前感谢您的帮助。
答案 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)