我在模板中有一個搜索欄
<input type="text" name="search" placeholder="Search...">
在模型中,我有兩個單獨的屬性 name 和 surname
class Person(models.Model):
name = models.CharField(max_length=50)
surname = models.CharField(max_length=50)
在views.py中我有這樣的邏輯
search = self.request.GET.get("search", None)
if search:
Person.objects.filter(Q(name=search) | Q(surname=search))
我想用姓氏或兩者都過濾
uj5u.com熱心網友回復:
您使用按位或 ( |) 運算子在兩個條件之間構造邏輯或,因此:
search = self.request.GET.get('search')
if search:
Person.objects.filter(Q(name=search) | Q(surname=search))
或者您可以定義兩個條件之間的連接器:
if search:
Person.objects.filter(Q(name=search, surname=search, _connector=Q.OR))
您還可以使用Concat[Django-doc]連接兩個欄位,然后使用以下內容進行過濾:
from django.db.models import CharField, Value
from django.db.models.functions import Concat
if search:
Person.objects.annotate(
full_name=Concat('name', Value(' '), 'surname', output_field=CharField())
).filter(Q(name=search, surname=search, full_name=search, _connector=Q.OR))
但是用這樣的查詢搜索不是一個好主意:如果添加一個額外的空格,或者將名字寫成 surname 后跟名字,這將不起作用。
如果要進行全文搜索,則需要搜索技術。例如PostgreSQL 的全文引擎并使用SearchQuery[Django-doc]或SearchQuery[Django-doc]。
另一種搜索方式是使用Solr、ElasticSearch等搜索技術,然后您可以使用django-haystack[readthedocs.io]呼叫搜索引擎。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/418207.html
標籤:
