在Django中连接字段值

1 投票
2 回答
1425 浏览
提问于 2025-04-16 12:19

我在一个模型中使用“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 个回答

3

如果你需要的功能超出了这个范围,

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

那么你可能需要直接使用原始的SQL语句。

当然,你可以在上面的过滤条件之前或之后添加你的 extra

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

撰写回答