次の Django モデルがあるとします。
class StandardLabel(models.Model):
id = models.AutoField(primary_key=True)
label = models.CharField(max_length=255)
abbreviation = models.CharField(max_length=255)
各ラベルには、ID 番号、ラベル テキスト、および略語があります。ここで、これらのラベルを他の言語に翻訳できるようにしたいと考えています。これを行う最善の方法は何ですか?
私が見ているように、いくつかのオプションがあります。
1: 翻訳をモデルのフィールドとして追加します。
class StandardLabel(models.Model):
id = models.AutoField(primary_key=True)
label_english = models.CharField(max_length=255)
abbreviation_english = models.CharField(max_length=255)
label_spanish = models.CharField(max_length=255)
abbreviation_spanish = models.CharField(max_length=255)
これは明らかに理想的ではありません。言語を追加するにはモデルを編集する必要があり、正しいフィールド名は言語によって異なります。
2: 言語を外部キーとして追加します。
class StandardLabel(models.Model):
id = models.AutoField(primary_key=True)
label = models.CharField(max_length=255)
abbreviation = models.CharField(max_length=255)
language = models.ForeignKey('languages.Language')
これははるかに優れています。特定の言語ですべてのラベルを要求し、それらを dict に入れることができるようになりました。
labels = StandardLabel.objects.filter(language=1)
labels = dict((x.pk, x) for x in labels)
しかし、ここでの問題は、次のように、ラベル dict がルックアップ テーブルであることを意図していることです。
x = OtherObjectWithAReferenceToTheseLabels.object.get(pk=3)
thelabel = labels[x.labelIdNumber].label
ラベルごとに行があり、単一のラベルに複数の言語がある可能性がある場合、これは機能しません。それを解決するには、別のフィールドが必要です。
class StandardLabel(models.Model):
id = models.AutoField(primary_key=True)
group_id = models.IntegerField(db_index=True)
label = models.CharField(max_length=255)
abbreviation = models.CharField(max_length=255)
language = models.ForeignKey('languages.Language')
class Meta:
unique_together=(("group_id", "language"),)
#and I need to group them differently:
labels = StandardLabel.objects.filter(language=1)
labels = dict((x.group_id, x) for x in labels)
3: ラベル テキストを新しいモデルに投入します。
class StandardLabel(models.Model):
id = models.AutoField(primary_key=True)
text = models.ManyToManyField('LabelText')
class LabelText(models.Model):
id = models.AutoField(primary_key=True)
label = models.CharField(max_length=255)
abbreviation = models.CharField(max_length=255)
language = models.ForeignKey('languages.Language')
labels = StandardLabel.objects.filter(text__language=1)
labels = dict((x.pk, x) for x in labels)
しかし、これは機能せず、ラベルのテキストを参照するたびにデータベース ヒットが発生します。
x = OtherObjectWithAReferenceToTheseLabels.object.get(pk=3)
thelabel = labels[x.labelIdNumber].text.get(language=1)
オプション 2 を実装しましたが、非常に見にくいと思います。group_id フィールドが気に入らず、これ以上の名前が思い浮かびません。さらに、私が使用している StandardLabel は抽象モデルであり、これをサブクラス化して、さまざまなフィールドのさまざまなラベル セットを取得します。
オプション 3 がデータベースにヒットしなかった場合は、それを選択すると思います。本当の問題は、フィルターがインスタンスをtext__language=1
キャッシュしないことだと思います。LabelText
text.get(language=1)
これについてどう思いますか?誰でもよりクリーンなソリューションを推奨できますか?
編集:明確にするために、これらはフォームラベルではないため、Django 国際化システムは役に立ちません。