【问题标题】:Django Filter QuerySet on List Using ANDDjango使用AND过滤列表上的查询集
【发布时间】:2017-06-18 21:32:22
【问题描述】:

我正在尝试使用带有相关子对象列表的 Django 的 .filter() 方法来返回包含所有子记录的父对象集。请参见下面的示例。

User是父对象,Color是与User直接相关的子对象

  • User1 有颜色[red, blue]
  • User2 有颜色[black, purple, green, blue]
  • User3 有颜色[red, blue, green]
  • User4 有颜色[red, blue, green, white]

users = users.filter(user_colors__color__in=colors)

colors 是 POST 设置的列表。例如。 [red, blue, green]

当前,users 包含具有[red, blue, green] 中的任何一个的用户集。对于上面的示例集,我目前正在使用上面的代码获得User1User2User3User4。 IE。它使用 OR 搜索。我只想返回具有所有指定颜色的用户。 IE。使用 AND 搜索。对于上面的例子,我只想得到User3User4

仅获取包含所有请求的子记录(颜色)的父记录集(用户)的最佳方法是什么?有没有可以轻松做到这一点的 Django 方法?还是我需要一个循环来过滤每种颜色?

谢谢!

【问题讨论】:

  • 我建议你阅读 Django 查询集 API here
  • 请发布您的模型,以便我们了解关系是如何定义的。

标签: python django filter


【解决方案1】:

假设您从其他地方获取颜色列表,我猜是这样:

from django.db.models import Q

# list of color instances
colors = [red, green, blue]

# create a list Q filters dynamically 
filter_by_this = [Q(user_colors__color=color) for color in colors]

# filter using the filter as a list of arguments
users = users.filter(*filter_by_this)

这没有经过测试,但我相信应该是这样的。

无论如何,您都应该阅读有关使用Q objects 进行过滤的内容。

【讨论】:

  • 您实际上可以只使用__in 来代替它。
  • OP 需要“&”而不是“或”
【解决方案2】:

一个简单的 for 循环就足够了:

# list of color instances
colors = [red, green, blue]

for x in colors:
    users = users.filter(user_colors__color=x) 

连续过滤器将作为 AND 操作

【讨论】:

    猜你喜欢
    • 2019-08-08
    • 2020-05-23
    • 1970-01-01
    • 2017-07-28
    • 2012-05-15
    • 2020-08-22
    • 2019-04-15
    • 2011-09-29
    相关资源
    最近更新 更多