簡體   English   中英

Django動態模型屬性

[英]Django dynamic model properties

我正在嘗試將動態模型屬性添加到Django模型,但它以某種方式不起作用並最終覆蓋屬性。

我想要實現的目標

我希望能夠編寫mymodel.title_de和django內部必須查詢數據庫並獲得正確的翻譯。

簡化的示例代碼(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

非常感謝您的任何想法!

財產應該有效,而且確實有效。 讓我們把它歸結為:

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

這樣你就可以獲得預期的結果。

因此,在MyModel邏輯中查找問題或嘗試清理緩存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM