Почему я не могу использовать __getattr__ с моделями Django?

Я видел в сети примеры людей, использующих __ getattr __ с моделями Django, но всякий раз, когда я пытаюсь это сделать, я получаю ошибки. (Django 1.2.3)

У меня нет проблем, когда я использую __ getattr __ на обычных объектах. Например:

class Post(object):
     def __getattr__(self, name):
         return 42

Отлично работает ...

  >>> from blog.models import Post
 >>> p = Post ()
 >>> p.random
 42

Теперь, когда я пробую это с моделью Django:

from django.db import models
class Post(models.Model):
     def __getattr__(self, name):
         return 42

И тестирую это на интерпретаторе:

  >>> from blog.models import Post
 >>> p = Post ()
 ОШИБКА: при токенизации ввода произошла непредвиденная ошибка.

следующая трассировка может быть повреждена или недействителен. Сообщение об ошибке: ('EOF в многострочном операторе ', (6, 0))

---------------------------------- ----------------------------------------- Ошибка типа
Отслеживание (последний звонок последним)

/ Users / josh / project / в ()

/Users/josh/project/lib/python2.6/site-packages/django/db/models/base.pyc в init (self, * args, ** kwargs) 338 если kwargs: 339 raise TypeError ("'% s' - недопустимое ключевое слово аргумент для этой функции "% kwargs.keys () [0]) -> 340 сигналов.post_init.send (sender = self. класс , instance = self) 341 342 def repr (сам):

/Users/josh/project/lib/python2.6/site-packages/django/dispatch/dispatcher.pyc in send (сам, отправитель, ** по имени) 160 161 для получателя в self._live_receivers (_make_id (sender)): -> 162 ответ = получатель (сигнал = сам, отправитель = отправитель, ** названо) 163 response.append ((получатель, ответ)) 164 ответных ответа

/Users/josh/project/python2.6/site-packages/photologue/models.pyc в add_methods (отправитель, экземпляр, сигнал, * аргументы, ** kwargs) 728 "" " 729, если hasattr (экземпляр, 'add_accessor_methods'): -> 730 instance.add_accessor_methods () 731 732 # подключаем функцию add_accessor_methods к post_init signal

TypeError: объект int не является callable

Может кто-нибудь объяснить, что происходит?


РЕДАКТИРОВАТЬ: Возможно, я был слишком абстрактным в примерах, вот код, который ближе к тому, что я действительно использовал бы на веб-сайте:

class Post(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField()
    date_published = models.DateTimeField()
    content = RichTextField('Content', blank=True, null=True)
    # Etc...

Class CuratedPost(models.Model):
    post = models.ForeignKey('Post')
    position = models.PositiveSmallIntegerField()

    def __getattr__(self, name):
        ''' If the user tries to access a property of the CuratedPost, return the property of the Post instead...  '''
        return self.post.name

    # Etc...

Хотя я может создать свойство для каждого атрибута класса Post, что приведет к большому дублированию кода. Более того, это будет означать, что каждый раз, когда я добавляю или редактирую атрибут класса Post, мне придется не забывать вносить те же изменения в класс CuratedPost, что похоже на рецепт гниения кода.

9
задан Joshmaker 10 January 2011 в 18:51
поделиться