Django: от запроса. ПОЛУЧИТЬ QuerySet - PullRequest
1 голос
/ 11 декабря 2019

Я знаю, как создать HTML-форму с Django, и я знаю, как получить доступ к значениям в request.GET.

Я знаю, как использовать ORM: MyModel.objects.filter(...)

СейчасЯ не могу найти, как добраться от request.GET до соответствующего QuerySet

Я не смог найти это в Django документах.

Пример:

class MyModel(models.Model):
    name=models.CharField(max_length=1024)

if request.GET содержит name=foo Я хотел бы иметь фильтр типа MyModel.objects.filter(name__icontains=request.GET['name']).

Я мог бы написать это самостоятельно, но я думаю, что это заново изобретает колесо. Мне это кажется слишком сложным.

Выше приведен только один пример. Я предпочитаю решение, которое больше настраивает, чем кодирование.

Ответы [ 3 ]

1 голос
/ 11 декабря 2019

Вы должны сделать это следующим образом

        filters = {}
        for param, value in request.GET.items():
            filters['{}_icontains'.format(param)] = value

        queryset = MyModel.objects.filter(**filters)

Ссылка https://docs.djangoproject.com/en/3.0/ref/request-response/#django.http.QueryDict.items

1 голос
/ 11 декабря 2019

Мы можем здесь создать Q объект:

from django.db.models import Q

MyModel.objects.filter(
    Q([('{}__icontains'.format(k), v) for k, vs in request.GET.lists() for v in vs])
)

Это будет работать так же хорошо, если определенный ключ встречается несколько раз в строке запроса. Обратите внимание, что поля, по которым вы запрашиваете, должны поддерживать __icontains [Django-doc] lookup.

Кроме того, это может быть небезопасно, поскольку, например,хакер может попытаться использовать user__password, чтобы угадать (хешированный) пароль пользователя.

0 голосов
/ 16 декабря 2019

Вы можете использовать django-таблицы2 и Джанго-фильтр

Объяснено здесь:

Джанго-фильтр может использоваться длясоздание интерфейсов, аналогичных интерфейсу администратора Django list_filter. Он имеет API, очень похожий на ModelForms Джанго. Например, если у вас была модель Продукта, вы могли бы иметь для нее набор фильтров с кодом:

import django_filters

class ProductFilter(django_filters.FilterSet):
    class Meta:
        model = Product
        fields = ['name', 'price', 'manufacturer']

И тогда, на ваш взгляд, вы могли бы сделать:

def product_list(request):
    filter = ProductFilter(request.GET, queryset=Product.objects.all())
    return render(request, 'my_app/template.html', {'filter': filter})

Как использовать django-фильтр в django-tables2, см. django-filter в django-table2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...