最佳实践:Django多语言

Jil*_*loc 10 django multilingual django-models

我是django的初学者.(我刚刚完成了本教程并遵循本指南http://www.gettingstartedwithdjango.com)我想建立一个多语言内容的网站,我知道哪种是最佳做法,至少对于模型:

  1. 使用不同的表(每种语言1个)
  2. 仅使用一个表,在模型中使用该语言的额外属性
  3. 我不知道

弗拉迪斯拉夫是对的,这完全取决于该表所包含的数据.举个例子:

class Book(models.Model):
    created_at = models.DateTimeField(auto_now_add=True, editable=False)
    name = models.CharField(max_length=255, unique=True)
    plot = models.TextField()
    slug = models.SlugField(max_length=255, blank=True, default='')

class Chapter(models.Model):
    book = models.ForeignKey(Book)
    chapter = models.SmallIntegerField()
    title = models.CharField(max_length=255, blank=True)
    pages = models.SmallIntegerField()
    pub_date = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

可能性:

  1. 我可能有一本完整的所有语言的书
  2. 我可能只用一种语言就有一本完整的书
  3. 我可能有一本完整的一种语言书,但只有一些章节用另一种语言

所以我认为我必须为每种语言保留一本书的实例,我至少有一本书的章节.

我希望很清楚!再次感谢大家

Vla*_*tov 7

对我来说,这一切都取决于桌子所包含的数据,没有一种尺寸适合所有人.

对于系统表(类别,字段选择),我为不同的语言执行一个表不同的列.旧的但很好的实现是django-transmeta.

对于具有大量行的表 - 具有公共信息的表和可翻译的表.通过这种方式,您可以动态添加语言 - 适用于您希望为用户提供多种语言选择的情况.显然我不确定这种方法有很好的实施方式.django-hvad是一个实现,但它仍然是测试版,我个人不喜欢使用它.

在这里,您可以找到有关可用插件的更多信息.

我可以推荐以下型号.

class Book(models.Model):
    """Model for common book info"""
    created_at = models.DateTimeField(auto_now_add=True, editable=False)
    #Other common fields


class BookTranslation(models.Model):
    """Model for translatable book info"""
    book = models.ForeignKey(Book, related_name="translations")
    language = models.CharField(max_length=2)
    name = models.CharField(max_length=255, unique=True)
    slug = models.SlugField(max_length=255, blank=True, default='')
    plot = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True, editable=False)


class Chapter(models.Model):
    """Model for common chapter info"""
    pub_date = models.DateTimeField(auto_now_add=True)
    pages = models.SmallIntegerField()

    #I'll suggest such relation so you can get the chapters from book 
    #and book translation objects
    #related_name='+' means no related_name
    #You need to specify it when you have 2 FK to same model
    book = models.ForeignKey(Book, related_name='+')
    book_translation = models.ForeignKey(Book, related_name='chapters')


class ChapterTranslation(models.Model):
    """Model for translatable chapter info"""
    chapter = models.ForeignKey(Chapter, related_name="translations")
    language = models.CharField(max_length=2)
    title = models.CharField(max_length=255, blank=True)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您熟悉select-relatedprefetch相关是很好的

在任何情况下,您都需要在顶部构建抽象,以便使用该结构.