gpt4 book ai didi

Django如何检查对象是否在多个字段中包含字符串

转载 作者:行者123 更新时间:2023-12-04 22:40:05 27 4
gpt4 key购买 nike

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

我想以某种方式能够查询我的数据库,以查看所打勾的字段是否包含搜索文本。例如,如果标题和问题被打勾,我将查询拼图的标题是否包含此字符串,或者其问题包含该字符串。有什么办法可以在Django中查询吗?

我知道,如果我只想检查这些字段之一(例如标题),就可以这样做:

Puzzle.objects.filter(title__contains=search_text)

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

目前,我的 View 包含三个 bool 值:标题,问题和主题。 bool 值被选中为True,否则为false。

我如何处理这三个 bool 值以及Django查询,以便能够动态查询数据库?

谢谢

最佳答案

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

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)

关于Django如何检查对象是否在多个字段中包含字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49239621/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com