Django 如何使用 ORM 进行动态 OR 查询

问题描述 投票:0回答:2

这是我的 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 查询

django django-models django-orm
2个回答
1
投票

您可以动态构建一个

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 对象 .


0
投票

您可以使用

from django.db.models import Q

some_model.objects.get(Q(email="email") | Q(whatsapp="1234567") | Q(phone="2341"), some_field="value")

您也可以使用

&
代替
|
进行
and
操作。

请阅读文档此处了解更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.