Disons que je le modèle Django suivant:étiquettes Django et traductions - Modèle de conception
class StandardLabel(models.Model):
id = models.AutoField(primary_key=True)
label = models.CharField(max_length=255)
abbreviation = models.CharField(max_length=255)
Chaque étiquette a un numéro d'identification, le texte de l'étiquette, et une abréviation. Maintenant, je veux que ces étiquettes soient traduisibles dans d'autres langues. Quelle est la meilleure façon de procéder?
Comme je le vois, j'ai quelques options:
1: Ajouter les traductions en tant que champs du modèle:
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)
Ce n'est évidemment pas idéal - l'ajout de langues nécessite la modification du modèle, le nom de champ correct dépend de la langue.
2: Ajouter la langue comme une clé étrangère:
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')
C'est beaucoup mieux, maintenant, je peux demander toutes les étiquettes avec une certaine langue, et de les jeter dans un dict:
labels = StandardLabel.objects.filter(language=1)
labels = dict((x.pk, x) for x in labels)
Mais le problème est ici que les étiquettes dict est censé être une table de consultation, comme ceci:
x = OtherObjectWithAReferenceToTheseLabels.object.get(pk=3)
thelabel = labels[x.labelIdNumber].label
qui doe sn't fonctionne s'il y a une ligne par étiquette, éventuellement avec plusieurs langues pour une seule étiquette. Pour résoudre celui-là, je besoin d'un autre domaine:
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: Throw texte ImprimEtiq dans un nouveau modèle:
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)
Mais cela ne fonctionne pas, et provoque une base de données a frappé à chaque fois Je fais référence au texte de l'étiquette:
x = OtherObjectWithAReferenceToTheseLabels.object.get(pk=3)
thelabel = labels[x.labelIdNumber].text.get(language=1)
J'ai 2 option existe, mais je trouve très laid - je n'aime pas le champ group_id, et je ne peux pas penser à quelque chose de mieux pour le nommer. En outre, StandardLabel comme je l'utilise est un modèle abstrait, que je sous-classe pour obtenir différents ensembles d'étiquettes pour différents champs.
Je suppose que si l'option 3/n'a pas/touché la base de données, c'est ce que je choisirais. Je crois que le vrai problème est que le filtre text__language=1
ne cache pas les instances LabelText
, et donc la DB est frappé quand je text.get(language=1)
Que pensez-vous de cela? Quelqu'un peut-il recommander une solution plus propre?
Édition: Pour que ce soit clair, ce ne sont pas des étiquettes de formulaire, donc le système d'internationalisation de Django n'aide pas.
Merci beaucoup! Ces deux applications semblent très prometteuses - maintenant je dois juste décider ce que je veux utiliser :) –
Oui, c'est un appel difficile. Personnellement, je préfère certaines choses sur le django-transmeta (comme la façon dont il se débarrasse du champ d'origine pour ne pas avoir besoin de logique complexe sur ce qu'il contient), mais j'aime que la modélisation django me permette de traduire des modèles sans toucher à leur code. –