django 将for循环查询集存储为一个

xfb7svmp  于 2023-10-21  发布在  Go
关注(0)|答案(2)|浏览(127)

我现在有一个数组有多个对象。for循环使用模型的for循环基于数组对象执行查询集。

search_post = ["1990", "2023"]
for query in search_post:
    vehicle_result = Vehicle.objects.filter(
        Q(title__icontains=query) |
        Q(details__icontains=query) |
        Q(year__icontains=query) |
        Q(notes__icontains=query)
    )
    print('vehicle_result: %s' % vehicle_result)

我遇到的问题是,当数组有多个元素时,它会为每个对象执行for循环,并输出每个对象的结果。如果我在代码中的其他地方调用这个变量,只保留最后一个对象的结果。
输出示例:

vehicle_result: <QuerySet [<Vehicle: BMW>]>
vehicle_result: <QuerySet [<Vehicle: Toyota>, <Vehicle: Mercedes>, <Vehicle: Honda>]>

我想存储/合并他们都到一个变量-防止丢失所有的结果(现在只有最后一个被保留,我猜,因为变量被覆盖)
我怎么能做到呢?

hujrc8aj

hujrc8aj1#

您需要构建查询,然后对其进行过滤,以便查询集在每次迭代中都不会更改。

q = Q()

for query in search_posts:
    q |= Q(title__icontains = query)
    q |= Q(details__icontains = query)
    q |= Q(year__icontains = query)
    q |= Q(notes__icontains = query)

Vehicle.objects.filter(q)

这将添加一个Q对象,每个字段都有一个OR,每个search_post项都有。有更简洁的方法,但最好不要过早地把事情复杂化。

4xy9mtcn

4xy9mtcn2#

我们可以通过构造一个Q对象来简化它:

from django.db.models import Q

search_post = ['1990', '2023']
fields = ['title', 'details', 'year', 'notes']
fitler_q = Q(
    *[(f'{field}__icontains', val) for val in search_post for field in fields],
    _connector=Q.OR,
)
Vehicle.objects.filter(filter_q)

相关问题