2015-12-11 2 views
3

Я пытаюсь добавить динамические свойства модели в модель 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)

Спасибо за любые идеи заранее!

+0

Это может не ответить на вопрос о том, как создавать динамические свойства, но рассмотрели ли вы что-то вроде http://django-modeltranslation.readthedocs.org? – fasouto

+2

это именно унаследованный код, который мне нужно уйти от ...;) –

+1

matthias, может ли быть 'abstract = True', который нарушает логику? потому что модель наследования и убирать классы с заказными менеджерами не танцуют вместе так хорошо .. (хотя у вас нет пользовательского менеджера здесь .. просто гадать ..) – doniyor

ответ

0

Недвижимость должна работать, и она действительно работает. Довести его до:

setattr(MyModel, 'title_de', property(lambda self: 'hallo')) 

Таким образом, вы получите ожидаемый результат.

Ищите проблему в логике MyModel или попробуйте очистить кеш.