这是我的 SQL 查询:
all_or_conditions = []
if request.GET.get('filter_phone'):
all_or_conditions.append("phone='"+request.GET.get('filter_phone')+"'")
if request.GET.get('filter_email'):
all_or_conditions.append("email='"+request.GET.get('filter_email')+"'")
if request.GET.get('filter_whatsapp'):
all_or_conditions.append("whatsapp='"+request.GET.get('filter_whatsapp')+"'")
sql_query = "SELECT * FROM app_table WHERE " + " OR ".join(all_or_conditions)
因此,如果仅设置一封电子邮件
sql_query
将类似于:
SELECT * FROM app_table WHERE email='[email protected]'
如果电子邮件和whatspp
SELECT * FROM app_table WHERE email='[email protected]' OR whatsapp='15557776655'
所以问题是,是否可以使用 Django ORM 进行此类查询,而不是通过执行 RAW 查询
您可以动态构建一个
Q
对象:
phone = request.GET.get('filter_phone')
email = request.GET.get('filter_email')
whatsapp = request.GET.get('filter_whatsapp')
q = Q(pk__in=[])
# something result-less, not to have an empty query in your disjunction
# that would hold for all entries
if phone:
q |= Q(phone=phone)
if email:
q |= Q(email=email)
if whatsapp:
q |= Q(whatsapp=whatsapp)
qs = qs.filter(q)
参见 始终为 False Q 对象 .
您可以使用
from django.db.models import Q
some_model.objects.get(Q(email="email") | Q(whatsapp="1234567") | Q(phone="2341"), some_field="value")
您也可以使用
&
代替 |
进行 and
操作。
请阅读文档此处了解更多详细信息。