gpt4 book ai didi

python - Django 动态模型属性

转载 作者:行者123 更新时间:2023-11-28 19:15:23 24 4
gpt4 key购买 nike

我正在尝试将动态模型属性添加到 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 逻辑中查找问题或尝试清理缓存。

关于python - Django 动态模型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34226902/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com