Python Django:基于相关对象初始化自定义模型变量
我试图在依赖于相关对象的django模型类中定义一个自定义变量。以下是我的代码的简化版本:Python Django:基于相关对象初始化自定义模型变量,python,django,Python,Django,我试图在依赖于相关对象的django模型类中定义一个自定义变量。以下是我的代码的简化版本: class Vm(models.Model): position = models.OneToOneField('Position', null=True, blank=True, default = None) def __init__(self, *args, **kwargs): models.Model.__init__(self) self.por
class Vm(models.Model):
position = models.OneToOneField('Position', null=True, blank=True, default = None)
def __init__(self, *args, **kwargs):
models.Model.__init__(self)
self.port = 5000+10*(self.position.position-1)
class Position(models.Model):
position = models.IntegerField()
因此,当我初始化一个Vm对象时,我想访问它的“端口”属性,该属性取决于它的相关外键“位置”
Vm对象和相应的位置对象已经创建并存储在DB中。当我试图初始化一个Vm对象时,
Vm=Vm.objects.get(pk=1)
我得到一个错误,AttributeError:“NoneType”对象没有属性“position”
就像position对象还没有初始化一样。如何执行此操作?这是因为位置
可为空,如果值为无
,则无法访问无
的位置
属性
一个解决办法是:
class Vm(models.Model):
position = models.OneToOneField('Position', null=True, blank=True, default = None)
def __init__(self, *args, **kwargs):
super(Vm, self).__init__( *args, **kwargs)
if self.position:
self.port = 5000+10*(self.position.position-1)
else:
self.port = 5000 #Or whatever the default you want to set.
另一种方法:
class Vm(models.Model):
position = models.OneToOneField('Position', null=True, blank=True, default = None)
def __init__(*args, **kwargs):
super(Vm, self).__init__(self, *args, **kwargs)
def port(self):
if self.position:
return 5000+10*(self.position.position-1)
else:
return 5000 #or any default value you wish to specify.
无论何时,只要您想访问端口
,请执行以下操作
vm = Vm.objects.get(pk=1)
port = vm.port()
谢谢你的回复!只想添加
super(Vm,self).\uuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu