Django использует фильтр icontains с несколькими значениями из словаря - PullRequest
1 голос
/ 03 октября 2019

Привет, я пытаюсь выполнить запрос поиска модели через словарь данных, которые я получил так:

{
   "city":5,
   "direction":"ne",
   ..other data that can be dynamic...
   "address__icontains" = ["word1", "word2", "word3"],
}

Мой поисковый запрос:

 Models.objects.filter(**query_dict)

, поскольку другие данные динамические , поэтому я использую фильтр со словарем. И я использую __ icontains для поиска в поле address (строковое значение), котороесодержит эти 3 слова в этой строке, поэтому проблема сейчас заключается в том, что __ icontains не принимает массив как в наборе запросов:

Models.objects.filter(other keys and values from dictionary, address__icontains= ["word1", "word2", "word3"])

Какя бы сделал это с помощью поиска по словарному фильтру?

мои данные в dict имеют 3 типа string, int и list (1 для поиска по диапазону, другой для поиска по иконкам), я хотел бы объединить поиск по словарю с иконками ипоиск

Я также попытался изменить словарь на

"address__icontains" = "word1 word2 word3"

, но он также не работает

Пример данных:

Что я делаю, так это нахожу свойство, которое имеетполе адреса с динамическими данными, такими как город, улица, район и район

Например:

Đng ĐT 9 (улица), Xã Mỹ Hạnh Nam (район), Đức Hòa (район), Лонг Ан (город)

, и он также имеет другие данные, например, например direction = "ne" и спец , которые для поиска в диапазоне имеют ключ типа "size__range"": [0,1000] в dict

, например, если" address__icontains "= [" Long An "," Hc Hòa "," Xã Mỹ Hạnh Nam "], то он должен вернуть выше Свойство элемент с таким адресом, direction = "ne" и размером имеет значение от 0 до 1000

Спасибо за чтение

1 Ответ

0 голосов
/ 03 октября 2019

Это должно сработать:

from operator import or_
from django.db.models import Q
from functools import reduce

instance = Model.objects.all()
def queryset_filter(instance, kwargs):
    for key, value in kwargs.items():
        if isinstance(value, list):
            instance.filter(reduce(or_, (Q(key=x) for x in value))
        else:
            instance.filter(key=value)
        return instance

Вы делаете дополнительную итерацию таким образом, но если ваш код требует более сложной фильтрации (например, с использованием наборов запросов из форм), вам нужно будет выполнить итерациюв любом случае.

...