有人告诉我使用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)

08-07 16:56