Python Django:基于相关对象初始化自定义模型变量

时间:2013-11-15 02:35:22

标签: 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.port = 5000+10*(self.position.position-1)

class Position(models.Model):
    position = models.IntegerField()

因此,当我初始化Vm对象时,我想访问其'port'属性,该属性取决于其相关的外键'position'。

Vm对象和相应的Position对象已经创建并存储在DB中。当我尝试初始化Vm对象vm = Vm.objects.get(pk=1)时,我得到错误AttributeError: 'NoneType' object has no attribute 'position',就像位置对象尚未初始化一样。我该怎么办?

1 个答案:

答案 0 :(得分:0)

这是因为position可以为空,如果值为None,则您无法访问position的{​​{1}}属性

一个解决方案是:

None

另一种方法:

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. 时,请执行

port