2013-11-15 2 views
2

Я пытаюсь определить пользовательскую переменную внутри класса модели django, которая зависит от связанного объекта. Вот упрощенная версия моего кода:Python 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 и соответствующий объект Position уже созданы и сохранены в DB. Когда я пытаюсь инициализировать объект Vm vm = Vm.objects.get(pk=1), я получаю ошибку AttributeError: 'NoneType' object has no attribute 'position', как и объект позиции еще не был инициализирован. Как мне это сделать?

ответ

0

Это потому, что position обнуляемые, и если значение None, вы не можете получить доступ к position атрибуту 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, do

vm = Vm.objects.get(pk=1) 
port = vm.port() 
+0

благодарит за ответ! просто хочу добавить, что 'super (Vm, self) .__ init __ (self, * args, ** kwargs)' должен быть 'super (Vm, self) .__ init __ (* args, ** kwargs)' – user2302807

+0

О, да, скопируйте пасту ошибка – karthikr

Смежные вопросы