私は、次のDjangoのモデルを考えてみましょう: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:
labels = StandardLabel.objects.filter(language=1)
labels = dict((x.pk, x) for x in labels)
:
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')
これは、今、私は特定の言語でのすべてのラベルを求める、と辞書にそれらを投げることができる、はるかに優れている:外部キーなどの言語を追加します。
しかし、ここでの問題は、ラベルの辞書はそうのようなルックアップテーブル、であることを意味するということである:DOE
x = OtherObjectWithAReferenceToTheseLabels.object.get(pk=3)
thelabel = labels[x.labelIdNumber].label
1つのラベルに複数の言語がある場合は、ラベルごとに行がある場合は機能しません。新しいモデルに投げラベルテキストアウト:
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:1つを解決するために、私は別のフィールドを必要とする
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
インスタンスをキャッシュしないため、DBがヒットした場合です。text.get(language=1)
これについてのご意見はありますか?誰もクリーナーソリューションをお勧めできますか?
:これはフォームラベルではないので、Django Internationalizationシステムは役に立ちません。
ありがとうございました!これらの2つのアプリは非常に有望に見える - 今私は使用するかを決定する必要があります:) –
ええ、それは厳しい呼び出しです。個人的に私はdjango-transmetaについていくつかのことを好んでいます(元のフィールドを取り除く方法のように複雑なロジックは必要ありません)。しかし、私はdjango-modeltranslationを使ってコードに触れることなくモデルを翻訳できます。 –