2010-11-16 3 views
1

Je suis actuellement en train d'interroger la table auth_users de django pour retourner les utilisateurs qui correspondent aux critères de recherche.Spécification d'un alias aux noms de colonne dans Django

users = User.objects.filter(
     Q(first_name__icontains = name)| 
     Q(username__icontains = name) | 
     Q(email__icontains = name) | 
     Q(last_name__icontains = name) 
    ).values(
     'id', 'username', 'first_name', 'last_name', 'email' 
    ).order_by('first_name') 

Je me demandais s'il est possible pour moi de changer le nom de « prenom » à « prenom »? comme nous pouvons le faire en SQL [Select first_name as firstname from auth_users];

pour que je puisse y accéder en utilisant prenom au lieu de prenom

Merci

+0

Juste par curiosité, pourquoi voulez-vous faire? – aptwebapps

+0

Il existe un code javascript hérité qui utilise des noms de champs différents, donc je pensais à renommer les colonnes à celles auxquelles il se réfère pour l'objet utilisateurs. –

Répondre

0

Je voudrais créer une couche de traduction entre les deux espaces de noms. Puisque vous utilisez l'ORM de Django et que le code JavaScript est hérité, je suppose que vous voudriez le faire en Python.

def translate(js_column_name): 
    return { 
     'firstname': 'first_name', 
    }.get(js_column_name, 'string to return when not found') 

Cette fonction de traduction, vous pouvez créer les arguments de mots clés dans un dictionnaire, puis passer que la fonction Q utilisant **:

User.objects.filter(
    Q(**{ 
     translate(js_firstname) + '_icontains': name 
    }) ... 

Bien sûr, je suppose que vous ne savez pas l'entrée vous la traduction est 'firstname' sinon vous pourriez simplement définir les noms de colonne corrects sans avoir besoin d'une fonction pour le faire (c'est-à-dire juste créer votre requête comme d'habitude). Donc à la place, je suppose que vous recevez dynamiquement les noms de colonnes JavaScript, auquel cas cette approche est ce que j'utiliserais.

P.S. J'espère que cela répond mieux à votre question. À l'avenir, je vous conseille de fournir un contexte pour votre problème (c'est-à-dire que vous spécifiez que vous avez ce problème parce que ..., et que les noms javascript apparaissent dynamiquement, etc.). De cette façon, votre question recevra une réponse plus rapidement.

1

Vous pouvez annoter les champs que vous voulez, avec le F expression:

from django.db.models import F 

users = User.objects.filter(
     Q(first_name__icontains = name)| 
     Q(username__icontains = name) | 
     Q(email__icontains = name) | 
     Q(last_name__icontains = name) 
    ).values(
     'id', 'username', 'first_name', 'last_name', 'email' 
    ).order_by('first_name' 
    ).annotate(firstname='first_name') 
Questions connexes