Я видел в сети примеры людей, использующих __ 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, что похоже на рецепт гниения кода.