首页 文章

Django使用AND在列表上过滤QuerySet

提问于
浏览
0

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

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

  • User1有颜色[红色,蓝色]

  • User2有颜色[黑色,紫色,绿色,蓝色]

  • User3有颜色[红色,蓝色,绿色]

  • User4有颜色[红色,蓝色,绿色,白色]

users = users.filter(user_colors__color__in = colors)

colors是POST设置的列表 . 例如 . [红色,蓝色,绿色]

目前,用户包含具有[红色,蓝色,绿色]中任何一个的用户集 . 对于上面的示例集,我目前正在使用上面的代码获取User1,User2,User3和User4 . 即它正在使用OR搜索 . 我想只返回具有所有指定颜色的用户 . 即使用AND搜索 . 对于上面的示例,我想只获取User3和User4 .

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

谢谢!

2 回答

  • 0

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

    # list of color instances
    colors = [red, green, blue]
    
    for x in colors:
        users = users.filter(user_colors__color=x)
    

    连续过滤器将作为AND运行

  • 0

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

    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过滤 .

相关问题