Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:基于相关对象初始化自定义模型变量_Python_Django - Fatal编程技术网

Python 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

我试图在依赖于相关对象的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.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