Каков подходящий способ переопределения класса модели getattr в Django 1.4?Соответствующий способ переопределения модели __getattr__ в 1.4
У меня есть модель структуры, как:
class Main(models.Model):
[blah]
class Detail(models.Model):
main = models.ForeignKey(Main)
name = models.CharField(max_length=255)
value= models.CharField(max_length=255)
Я переопределены мой Main. getattr _ так что я мог бы ссылаться на детали записей, как если бы они были нормальными Основные атрибуты. например простой мета- модель модель как
>>> m = Main.objects.create()
>>> Detail.objects.create(main=m, name='name', value='value')
>>> print m.name
'value'
Чтобы сделать это, мой до 1,4 GetAttr выглядел как:
def __getattr__(self, attrname):
qs = self.details.filter(name=attrname)
c = len(qs)
if c == 0:
raise AttributeError
elif c == 1:
return qs[0].value
else:
return [d.value for d in qs]
Это работало отлично, пока я повышен до 1,4. Теперь я получаю все типы ошибки «атрибут X не существует». Я пробовал что-то вроде , но не повезло. Кажется, что в особенности конфликтуют с атрибутами «_ * _ _ cache» , которые Django генерирует для ссылок ForeignKey.
def __getattr__(self, attrname):
try:
return super(Main, self).__getattr__(attrname)
except AttributeError:
pass
qs = self.details.filter(name=attrname)
c = len(qs)
if c == 0:
raise AttributeError
elif c == 1:
return qs[0].value
else:
return [d.value for d in qs]
Как это разрешить?
Это подходящее время, чтобы остановиться и спросить: почему H-E-хоккейные клюшки вы делаете *, что *? Мало того, что он похож на грязный хак, он также * чрезвычайно неэффективен, генерируя запрос базы данных каждый раз, когда вы получаете доступ к атрибуту экземпляра. Вы даже не кешируете ничего. –
По общему признанию, мой случай необычен. Чтобы кратко описать это, моя модель позволяет пользователям определять свои собственные модели. Кэширование является тривиальным для добавления, которое я забыл для простоты. – Cerin