从循环创建类dict条目的好方法比locals()

时间:2017-11-03 23:05:28

标签: python django wagtail

我被告知使用locals()在Python中动态创建变量是不好的形式。但是,我正在编写一个类(使用Django和Wagtail),我确实需要将这些东西放在类dict中,即class语句的局部变量,而不是单独的数据结构:

class BlogPage(Page):
    for language in languages:
        locals()['body_' + language] = RichTextField(blank=True)

我认为我不能在setattr的类语句之后设置它们,因为那时Django的元类处理已经发生了。

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

将不同语言作为模型属性的问题是更改语言需要迁移数据库。如果你能提供帮助,这不是你想做的事。

解决此问题的正确方法是使用单独的模型将页面和语言映射到适当的内容。

class BlogPageTranslation(model.Model):
  language = TextField()
  blogpage = ForeignKey(BlogPage)
  content = RichTextField()

然后,在查询页面时,查找具有所需语言和理智默认值的翻译,然后选择相应的行。

xlatcontents = BlogPageTranslation.filter(blogpage=Page,
  language__in=[someLanguage, 'en'])
somethingsomething(xlatcontents, someLanguage)