2016-07-27 1 views
1

Site Web multilingue avec des traductions stockées dans des colonnes d'une table. Nécessité de passer l'ensemble de requêtes au modèle avec des traductions déjà filtrées. La variable de langue est stockée en session.Annoter l'ensemble de requêtes avec la valeur du champ

class Item(models.Model): 
    name = models.CharField(max_length=128) 
    description = models.ForeignKey(Localization) 

class Localization(models.Model): 
    klingon = models.TextField(blank=True, null=True, verbose_name='klingon') 
    english = models.TextField(blank=True, null=True, verbose_name='english') 

pensée serait bien juste pour annoter les qs avec le texte nécessaire, mais je réussi à trouver comment annoter avec une valeur de champ. Quelque chose comme

item = Item.objects.all().annotate(text=description.klingon) 

Une autre approche serait d'utiliser un filtre de modèle comme

item.description|choose_lang:request 

mais le tri des qs avant que le modèle semble plus propre.

Répondre

7

Vous pouvez utiliser l'expression F() ici.

from django.db.models import F  
item = Item.objects.all().annotate(text=F('description__klingon')) 

Docs: https://docs.djangoproject.com/en/1.9/ref/models/expressions/#using-f-with-annotations

+0

Merci. J'ai essayé ces choses F par moi-même, mais il s'est avéré que j'ai fait une erreur dans un endroit différent du code et quand il a échoué j'ai pensé que j'avais ces instructions fa fausses :) Maintenant tout fonctionne bien. –