Django QuerySet OR 语句 [重复]

Posted

技术标签:

【中文标题】Django QuerySet OR 语句 [重复]【英文标题】:Django QuerySet OR statement [duplicate] 【发布时间】:2017-06-22 23:29:42 【问题描述】:

有没有办法在 Django 中获取一个 QuerySet,以便剩余的对象至少满足多个约束中的一个(即 OR 语句)?

类似:

remaining = Fruits.objects.all()

fruit_type = ['apple', 'orange'] # input from user
for fruit in fruit_type:
  remaining = remaining.filter(FruitType__icontains=fruit)

但是,上面只返回同时包含 'orange' 和 'apple' 的 FruitTypes(而不是 orange OR apple)。

【问题讨论】:

检查这个问题***.com/questions/4824759/… docs.djangoproject.com/en/1.10/topics/db/queries/… 浏览此链接 【参考方案1】:

你可以的

from django.db.models import Q
query = Q()
for fruit in fruit_type:
    query |= Q(FruitType__icontains=fruit)
remaining = remaining.filter(query)

【讨论】:

【参考方案2】:

你可以使用 Q 对象来执行复杂的查询集

from django.db.models import Q

for fruit in fruit_type:
    query |= Q(FruitType__icontains=fruit)

# Query the model
remaining = remaining.filter(query)

请参阅 django 文档https://docs.djangoproject.com/en/1.10/topics/db/queries/#complex-lookups-with-q 了解更多信息。

【讨论】:

有没有办法将它集成到for 循环中?用户输入fruit_type,因此它的长度可能是0到10。最坏的情况是我可以写10个if我想的语句。无论如何感谢您的帮助! 是的,你可以。我编辑了分析器,希望对您有所帮助。【参考方案3】:
fruit_type = ['apple', 'orange']
remaining = Fruits.objects.filter(FruitType__in=fruit_type)

【讨论】:

以上是关于Django QuerySet OR 语句 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Django QuerySet按表达式排序[重复]

在django中动态添加参数到queryset过滤器调用[重复]

为啥带有 Q() 表达式的 Django QuerySet 返回重复值?

Django常用的QuerySet操作

django

django+SQLite搭建轻量级个人博客QuerySet的exists()方法检查是否有数据