【问题标题】:Django dynamic model propertiesDjango 动态模型属性
【发布时间】:2016-03-17 13:33:28
【问题描述】:

我正在尝试将动态模型属性添加到 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)

非常感谢您提前提出的任何想法!

【问题讨论】:

  • 这可能无法回答有关如何创建动态属性的问题,但您是否考虑过使用类似 django-modeltranslation.readthedocs.org 的东西?
  • 这正是我必须摆脱的遗留代码...... ;)
  • matthias,会不会是 abstract = True 这打破了逻辑?因为模型继承和带有自定义管理器的抽象类不能很好地一起跳舞..(即使你这里没有自定义管理器..只是猜测..)
  • 是的,你可能是对的!

标签: python django dynamic properties translation


【解决方案1】:

属性应该有效,并且确实有效。让我们归结为:

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

这样你会得到你预期的结果。

因此在MyModel 逻辑中查找问题或尝试清理缓存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 2018-12-06
    • 2011-12-09
    • 2023-03-27
    • 2015-08-28
    • 2016-12-15
    • 2019-03-04
    相关资源
    最近更新 更多