Уведомления

Группа в Telegram: @pythonsu

#1 Июль 24, 2015 16:01:08

dobroe_ytro_na_foryme
Зарегистрирован: 2014-01-22
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

**kwargs

Доброго времени суток, дорогие форумчане.

Сегодня потребовалось создать нечто вроде фильтрации объектов по необходимым параметрам.
Если коротко:
Как погрузить данные в objects.filter()

        kwargs = [('template__t_type', self.type)]
        if self.par1: kwargs.append(('template__par1__gte', self.par1))
        if self.par2: kwargs.append(('template__par2__gte', self.par2))
        if self.par3: kwargs.append(('template__par3__gte', self.par3))
        if self.par4: kwargs.append(('template__par4__gte', self.par4))
        if self.par5: kwargs.append(('template__par5__gte', self.par5))
        user_index = SomeOne.objects.filter(kwargs)

Перепробовал массу вариантов. Начал конечно с того, что **kwargs = dict

Отредактировано dobroe_ytro_na_foryme (Июль 24, 2015 16:03:22)

Офлайн

#2 Июль 24, 2015 16:29:06

dobroe_ytro_na_foryme
Зарегистрирован: 2014-01-22
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

**kwargs

Написал вот такую функцию

def kwargs_fabric(kwargs):
    for i in range(len(kwargs)):
        return kwargs[i]
user_index = SomeOne.objects.filter(kwargs_fabric(kwargs))
filter ее глотает, но результат выборки похоже не верный.

Отредактировано dobroe_ytro_na_foryme (Июль 24, 2015 16:29:36)

Офлайн

#3 Июль 24, 2015 16:33:16

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

**kwargs

Как-то так:

from django.db.models import Q
 kwargs = [Q(template__t_type = self.type)]
 if self.par1: kwargs.append(Q(template__par1__gte = self.par1))
user_index = SomeOne.objects.filter(*kwargs)



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#4 Июль 24, 2015 16:40:39

dobroe_ytro_na_foryme
Зарегистрирован: 2014-01-22
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

**kwargs

Rodegast
Как-то так:
Такая штука не работает, выдает ошибку
need more than 1 value to unpack
/var/www/.envs/asast/local/lib/python2.7/site-packages/django/db/models/sql/query.py in build_filter
        The 'can_reuse' is a set of reusable joins for multijoins.
        The method will create a filter clause that can be added to the current
        query. However, if the filter isn't added to the query then the caller
        is responsible for unreffing the joins used.
        """
                    arg, value = filter_expr ...
        if not arg:
            raise FieldError("Cannot parse keyword query %r" % arg)
        lookups, parts, reffed_aggregate = self.solve_lookup_type(arg)
        if not allow_joins and len(parts) > 1:
            raise FieldError("Joined field references are not permitted in this query")
▼ Local vars
Variable	Value
current_negated	
False
split_subq	
True
branch_negated	
False
self	
<django.db.models.sql.query.Query object at 0x7f523603c9d0>
connector	
u'AND'
allow_joins	
True
filter_expr	
[<Q: (AND: ('template__t_type__id', 7))>]
can_reuse	
set([])

А вот с функцией все норм получается. Странное это правда.

Офлайн

#5 Июль 24, 2015 16:44:32

dobroe_ytro_na_foryme
Зарегистрирован: 2014-01-22
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

**kwargs

Упс, работает…
Не доставил * в SomeOne.objects.filter(*kwargs)

Разобрался с *args и **kwargs, спасибо!

Отредактировано dobroe_ytro_na_foryme (Июль 24, 2015 17:02:07)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version