Я пытаюсь добавить динамические свойства модели в модель Django, но она как-то не работает и в конечном итоге переписывает свойства.Свойства динамической модели Django
То, что я пытаюсь достичь
Я хочу, чтобы иметь возможность написать mymodel.title_de и Джанго внутренне должен запросить Databse и получить правильный перевод.
Упрощенный пример кода (models.py)
class Translation(models.Model):
def get_prototype(self, model, cache_id, default, lang=None):
if not lang:
lang = get_language()
cached = cache.get('%s_%s_%s' % (cache_id, self.id, lang))
if not cached:
try:
cached = model.objects.get(quiz_id=self.id, lang=lang).translation
cache.set('%s_%s_%s' % (cache_id, self.id, lang), cached, 60*60)
return cached
except model.DoesNotExist:
return default
else:
return cached
class MyModel(Translation):
# lots of things
pass
class MyModelTrans(models.Model):
mymodel = models.ForeignKey(MyModel)
lang = models.CharField(max_length=5, choices=settings.LANGUAGES, db_index=True)
class Meta:
unique_together = ('mymodel', 'lang')
abstract = True
class MyModelTitleTrans(MyModelTrans):
translation = models.TextField()
mymodel_attr_mapping = {
'title': [MyModelTitleTrans, 'qtitle', ''],
}
for key in mymodel_attr_mapping.keys():
def attr_general(self):
return self.get_prototype(
mymodel_attr_mapping[key][0],
mymodel_attr_mapping[key][1],
mymodel_attr_mapping[key][2])
setattr(MyModel, key, property(attr_general))
for l in settings.LANGUAGES:
def attr_lang(self):
return self.get_prototype(
mymodel_attr_mapping[key][0],
mymodel_attr_mapping[key][1],
mymodel_attr_mapping[key][2], l[0])
setattr(MyModel, '%s_%s' % (key, l[0]), property(attr_lang))
Ожидаемый результат
m = MyModel()
m.save()
mtt = MyModelTitleTrans.objects.create(mymodel=m, lang='de', translation='hallo')
mtt.save()
m.title_de
>>> 'hallo'
Текущий результат
Пустая строка
Бонус вопрос
Есть ли другой способ достичь этого? Неудача Я не могу изменить способ запроса перевода (m.title_de)
Спасибо за любые идеи заранее!
Это может не ответить на вопрос о том, как создавать динамические свойства, но рассмотрели ли вы что-то вроде http://django-modeltranslation.readthedocs.org? – fasouto
это именно унаследованный код, который мне нужно уйти от ...;) –
matthias, может ли быть 'abstract = True', который нарушает логику? потому что модель наследования и убирать классы с заказными менеджерами не танцуют вместе так хорошо .. (хотя у вас нет пользовательского менеджера здесь .. просто гадать ..) – doniyor