连接两列后的Django queryset过滤器

Vir*_*anu 13 python sql django django-models

有没有办法使用两个列的串联来过滤模型?我的模型是这样的:

class Item(models.Model):
    series = models.CharField(max_length=50)
    number = models.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)

我需要的是在两列连接之后进行过滤,如果用户输入A123我希望能够找到任何具有系列和数字的项目,如%A和123%或%A1和23%这是否可以使用django型号?或者是否可以使用原始sql?我宁愿不用连接构造一个新列.

小智 24

除了前面所说的,例如:

from django.db.models import Value
from django.db.models.functions import Concat
queryset = Item.objects.annotate(search_name=Concat('series', Value(' '), 'number'))
# then you can filter:
queryset.filter(search_name__icontains='whatever text')
Run Code Online (Sandbox Code Playgroud)


mcc*_*ccc 21

是的,这是可能的; 您将需要annotate具有字段串联的QuerySet,并且新的"虚拟"列将能够进行过滤.

有关过滤注释的相关文档

使用Concat作为注释功能


oza*_*zan 6

我找到了自己的方式,如果你要使用一些ajax请求,那么我就开始像这样使用了

在views.py中

AllUser = User.objects.all()
users = []
for i in AllUser:
    if query in i.get_full_name():
        users += [{'first_name':i.first_name,'last_name':i.last_name,'full_name':i.get_full_name()}]

qUser = users
Run Code Online (Sandbox Code Playgroud)

并在返回的ajax页面(在我的情况下'searchajax.html')

{% if qUser %}
  {% for i in qUser %}
    <p class="queryP">{{ i.full_name }}</p>
  {% endfor %}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

它对我来说非常好:))

另一种方法是使用注释

from django.db.models import CharField, Value as V
from django.db.models.functions import Concat
author =  User.objects.annotate(screen_name=Concat('first_name', V(' ') ,'last_name'))
for i in author:
    print i.screen_name
Run Code Online (Sandbox Code Playgroud)

它也做同样的工作:))