2015-06-16 3 views
1

Я пытался создать динамическое свойство с помощью декоратора метода, проблема, с которой я сталкиваюсь, заключается в том, что я хочу использовать это поле, если пользователь не сохранил его/ее собственный. Например:Свойство возврата Django, если не возвращает результат возврата null

class Person(models.Model): 
    name = models.CharField(max_length=100, null=True, blank=True) 

    def __str__(self): 
     return self.name 

    @property 
    def name(self): 
     return self.name if self.name else "John" 

В принципе, я хочу вернуть «Джон», если я не нахожу ничего в полях имени. Однако, делая это таким образом, Django жалуется, потому что self.name изучает функцию имени, а не фактическое свойство.

maximum recursion depth exceeded while calling a Python object

Есть ли способ сослаться на недвижимое имущество или, может быть, какой-то другой способ для достижения этой цели?

ответ

2

простой способ сделать это, чтобы переименовать акцесора/свойство:

class Person(models.Model): 
    name = models.CharField(max_length=100, null=True, blank=True) 

    def __str__(self): 
     return self.name 

    def get_name(self): 
     return self.name if self.name else "John" 

тогда, когда у вас есть экземпляр:

person.get_name()

2

Вы не должны дублировать имена в пределах одного пространства имен , Вы можете либо переименовать свое поле от name до _name, так как вы не собираетесь раскрывать его или не присвоить своей собственности другое имя.

На самом деле, я не вижу способа получить начальный атрибут name. Похоже, что он полностью перекрывает свойством:

In [8]: 1 class A(object): 
      2  name = 0 
      3  @property 
      4  def name(): 
      5   return self.name or 5 

In [9]: A.__dict__ 
Out[9]: 
<dictproxy {'__dict__': <attribute '__dict__' of 'A' objects>, 
'__doc__': None, 
'__module__': '__main__', 
'__weakref__': <attribute '__weakref__' of 'A' objects>, 
'name': <property at 0x7f50832736d8>}> 
1

Есть ли причина, по которой вы не можете использовать default? Вы можете поместить вызываемый код там, если хотите что-то более интересное, чем одно значение.

Из документов:

def name_default(): 
    return "John" 

name = models.CharField(max_length=100, default=name_default) 
+0

Это будет отличная идея ... Мне нужно, чтобы получить доступ к себя и определить, что «Джон» будет, как на основе других полей в объекте. Не удалось это упомянуть. +1 в любом случае; это сработало бы хорошо. – mimoralea

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