【问题标题】:Django how to check if objects contains string in multiple fieldsDjango如何检查对象是否在多个字段中包含字符串
【发布时间】:2018-08-20 17:34:35
【问题描述】:

所以我有一个名为 Puzzle 的模型,其中包含标题、问题和主题。我希望能够通过输入字符串来搜索谜题。我的搜索栏还包含三个复选框: - 标题 - 题 - 主题

我希望能够以某种方式查询我的数据库以查看勾选的字段是否包含搜索文本。例如,如果标题和问题被勾选,我会查询拼图的标题是否包含此字符串,或者其问题是否包含该字符串。有没有办法在 Django 中查询这个?

我知道如果我只想检查其中一个字段,例如标题,我可以这样做:

Puzzle.objects.filter(title__contains=search_text)

但我希望能够动态查询打勾的字段。

目前,我的视图包含三个布尔值:标题、问题和主题。布尔值为 True 是否已勾选,如果未勾选则为 false。

如何操作这三个布尔值以及 Django 查询以便能够动态查询我的数据库?

谢谢

【问题讨论】:

    标签: django


    【解决方案1】:

    您可以使用Q objects 进行OR 查询:

    from django.db.models import Q
    
    Puzzle.objects.filter(
        Q(title__contains=search_text) |
        Q(question__contains=search_text) |
        Q(subject__contains=search_text)
    )
    

    当然你可以动态构建这个Q对象:

    q = Q()
    if title:
        q |= Q(title__contains=search_text)
    if question:
        q |= Q(question__contains=search_text)
    if subject:
        q |= Q(subject__contains=search_text)
    
    # If you want no result if none of the fields is selected
    if q:
        queryset = Puzzle.objects.filter(q)
    else:
        queryset = Puzzle.objects.none()
    
    # Or if you want all results if none of the fields is selected
    queryset = Puzzle.objects.filter(q)
    

    如果您在列表中包含所有选定的字段(即search_fields = ['title', 'subject'],您甚至可以使其更通用:

    from functools import reduce
    from operators import or_
    
    q = reduce(or_, [Q(**{f'{f}__contains': search_text}) for f in search_fields], Q())
    Puzzle.objects.filter(q)
    

    【讨论】:

      猜你喜欢
      • 2014-12-27
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 2017-09-22
      • 1970-01-01
      • 2014-06-25
      • 2013-02-05
      相关资源
      最近更新 更多