有人告诉我使用locals()在Python中动态创建变量是一种不好的形式。但是,我正在编写一个类(使用Django和Wagtail),并且确实需要将这些内容放入类dict中,也就是class
语句的局部变量,而不是放在单独的数据结构中:
class BlogPage(Page):
for language in languages:
locals()['body_' + language] = RichTextField(blank=True)
我也不认为可以在使用
setattr
的类语句之后设置这些设置,因为到那时Django的元类处理已经发生了。有没有更好的办法?
最佳答案
将不同的语言作为模型的属性存在的问题是,更改语言需要迁移数据库。如果可以的话,这不是您想做的事情。
解决此问题的正确方法是使用单独的模型,该模型将页面和语言映射到适当的内容。
class BlogPageTranslation(model.Model):
language = TextField()
blogpage = ForeignKey(BlogPage)
content = RichTextField()
然后,在查询页面时,查找所需语言和默认的翻译,然后选择适当的行。
xlatcontents = BlogPageTranslation.filter(blogpage=Page,
language__in=[someLanguage, 'en'])
somethingsomething(xlatcontents, someLanguage)