2011-02-22 3 views
1

J'ai créé avec la clause "extra" un champ concaténé sur trois champs de texte dans un modèle - et je pense pouvoir le faire: q.filter (concatenated__icontains = "y") mais ça me donne une erreur. Quelles alternatives sont là?Concaténation de valeurs de champs dans Django

>>> q = Patient.objects.extra(select={'concatenated': "mrn||' '||first_name||' '||last_name"}) 
>>> q.filter(concatenated__icontains="y") 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 561, in filter 
    return self._filter_or_exclude(False, *args, **kwargs) 
    File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 579, in _filter_or_exclude 
    clone.query.add_q(Q(*args, **kwargs)) 
    File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1170, in add_q 
    can_reuse=used_aliases, force_having=force_having) 
    File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1058, in add_filter 
    negate=negate, process_extras=process_extras) 
    File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1237, in setup_joins 
    "Choices are: %s" % (name, ", ".join(names))) 
FieldError: Cannot resolve keyword 'concatenated' into field. Choices are: first_name, id, last_name, mrn, specimen 

Répondre

0

Ma solution finale basée sur la réponse Prasad:

from django.db.models import Q 

searchterm='y' 
Patient.objects.filter(Q(mrn__icontains=searchterm) | Q(first_name__icontains=searchterm) | Q(last_name__icontains=searchterm)) 
3

Si vous besoin de quelque chose au-delà,

Patient.objects.filter(first_name__icointains='y' | last_name__icontains='y' | mrn__icontains='y') 

vous pourriez avoir recours à SQL brut.

Bien sûr, vous pouvez ajouter votre extra avant ou après le filtre ci-dessus.

+0

Merci, c'est une solution élégante qui permet de résoudre mon problème. – Toshio

+0

ce n'est pas du vrai django! – Stefano

Questions connexes