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

Python Django: initialize custom model variable based on related object

我试图在django模型类中定义一个自定义变量,该变量依赖于相关的对象。以下是我的代码的简化版本:

1
2
3
4
5
6
7
8
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对象vm = Vm.objects.get(pk=1)时,我得到了错误AttributeError: 'NoneType' object has no attribute 'position',就像position对象尚未初始化一样。我该怎么做?


这是因为position可以为空,如果值为None则不能访问Noneposition属性。

一个解决办法是:

1
2
3
4
5
6
7
8
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.

另一种方法:

1
2
3
4
5
6
7
8
9
10
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,都要

1
2
vm = Vm.objects.get(pk=1)
port = vm.port()