Как динамично обеспечить имя поля поиска в запросе Django? [дубликат]

я не предполагаю там, что путь состоит в том, чтобы позволить промежутки на нескольких строках в разметке, не имение их представляет пространство?

Не точно, но:

<span>...</span
><span>...</span>
19
задан Yuval Adam 4 August 2009 в 12:05
поделиться

3 ответа

Я думаю, что может быть лучший способ сделать это с помощью системы запросов Django. Вот как это сделать по-своему.

Python позволяет передавать словари для использования в качестве списков аргументов, добавляя к ним префикс **. Если вам повезет, вы сможете сделать что-то вроде этого:

lookup = "%s__contains" % field
results.append(Item.objects.filter(**{ lookup: keyword}))
20
ответ дан 30 November 2019 в 02:29
поделиться

Я бы предпочел использовать объект Q для чего-то вроде этого.

from django.db.models import Q

keyword = 'keyword'
fields = ['foo', 'bar', 'baz']

Qr = None
for field in fields:
    q = Q(**{"%s__contains" % field: keyword })
    if Qr:
        Qr = Qr | q # or & for filtering
    else:
        Qr = q

# this you can now combine with other filters, exclude etc.    
results = MyModel.objects.filter(Qr)
28
ответ дан 30 November 2019 в 02:29
поделиться

Мне нравится ответ DialZ, но по соображениям производительности вы должны создать запрос и затем один раз обратиться к базе данных вместо того, чтобы объединять все результаты в список:

keyword = 'keyword'
fields = ['foo', 'bar', 'baz']

# this makes an empty queryset object which we can
# add to later using the | operator
results = Item.objects.none()

for field in fields:
    lookup = "%s__contains" % field
    query = {lookup : keyword}
    results = results | Item.objects.filter(**query)

Я не делал ни одного из этих через некоторое время, но я почти уверен, что django вообще не попадет в базу данных в этом коде. Он будет выполнять запрос только при доступе к данным, содержащимся в записях

5
ответ дан 30 November 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: