在Django中连接字段值

时间:2011-02-22 19:10:25

标签: python django

我使用“extra”子句创建了模型中三个文本字段中的连接字段 - 我希望能够这样做:q.filter(concatenated__icontains =“y”)但它给了我一个错误。还有什么替代方案?

>>> 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

2 个答案:

答案 0 :(得分:3)

如果您需要超出此范围的内容,

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

你可能不得不诉诸原始SQL。

当然,您可以在上面的过滤器之前或之后添加extra

答案 1 :(得分:0)

我的最终解决方案基于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))
相关问题