2016-04-08 3 views
0

Имеет запрос django для фильтрации через модель и распечатывает условие, соответствующее поиску.Django Filter with AND

Вот мнение

if user_search != '' and (start_date != '' and end_date != ''): 
    items = Order.objects.filter(
     Q(client__email__iexact=user_search) , Q(created_on__range=(start_date, end_date)) 
     ) 
    print "items ", items 

Джанго фильтр напечатать адрес электронной почты пользователь искал, который попадет в указанном диапазоне дат. Но код Возникают также печатает электронную почту, что не искали, но попадает в диапазон дат

Вот это модель

class Order(models.Model): 
    client    =  models.ForeignKey(User, related_name = "order_user") 
    order_number   =  models.CharField(max_length = 12)null=True) 
    terms_and_conditions =  models.BooleanField(default=False) 
    order_status   =  models.CharField(max_length = 20, choices = ORDER_STATUS, default = "new") 
    created_on   =  models.DateTimeField(auto_now_add = True) 
    edited_on   =  models.DateTimeField(auto_now_add = False) 



    def __unicode__(self): 
     return self.order_number 
+0

Я не могу воспроизвести это в Django 1.8. Наличие двух аргументов 'Q' должно быть эквивалентно использованию оператора' & ', то есть' Q (client__email__iexact = user_search) & Q (created_on__range = (start_date, end_date) '. Обратите внимание, что вам вообще не нужно' Q'. Ваш код может быть упрощен до 'Order.objects.filter (client__email__iexact = user_search, created_on__range = (start_date, end_date)). – Alasdair

+0

@Alasdair Used & operator, но все еще печатает адрес электронной почты, я не искал – uche

+0

. Я хочу сказать, что ваш существующий код ** не должен ** возвращать адреса электронной почты, если дата вне диапазона. Это может помочь, если вы покажете еще один код, который может воспроизвести проблему, и результаты, которые вы получаете. Возможно, вы не используете (например, вы не перезапустили сервер после смены кода). – Alasdair

ответ

1

Использование & для выполнения операций и на Q объектов.

if user_search != '' and (start_date != '' and end_date != ''): 
    items = Order.objects.filter(
     Q(client__email__iexact=user_search) & Q(created_on__range=(start_date, end_date)) 
     ) 
    print "items ", items 
+0

Использовал & оператор, но все еще печатает адрес электронной почты, я не искал – uche

+0

, отметим, что мы использовали 'iexact', который должен делать нечувствительность к регистру POs t ur 'Код заказа'. –

+0

@uche опубликуйте код модели пользователя. –