2016-04-08 11 views
0

Bin mit einer Django-Abfrage, um durch ein Modell zu filtern und die Bedingung auszudrucken, die die Suche erfüllt. HierDjango-Filter mit AND

ist die Aussicht

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 

Der django Filter ist E-Mail-Adresse drucken die Benutzer gesucht, die innerhalb des Datumsbereich fällt. Aber der Code auch habe druckt E-Mail, die nicht durchsucht wurde, sondern fällt in den Datumsbereich

Hier ist das Modell

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

Ich kann das in Django 1.8 nicht reproduzieren. Zwei 'Q'-Argumente sollten dem Operator' & 'entsprechen, dh' Q (client__email__iexact = user_search) und Q (created_on__range = (start_datum, end_datum) '.) Beachten Sie, dass Sie' Q' hier gar nicht brauchen. Ihr Code könnte zu 'Order.objects.filter '(client__email__iexact = user_search, created_on__range = (Start_Datum, Enddatum))' ' – Alasdair

+0

@Alasdair Used & Operator, aber druckt immer noch E-Mail-Adresse Ich habe nicht nach – uche

+0

Mein Punkt ist, dass Ihre Der vorhandene Code ** sollte keine E-Mail-Adressen zurückgeben, wenn das Datum außerhalb des Bereichs liegt. Es kann hilfreich sein, wenn Sie mehr Code anzeigen, der das Problem reproduzieren kann, und die Ergebnisse, die Sie erhalten (Sie haben den Server nach dem Ändern des Codes nicht neu gestartet.) – Alasdair

Antwort

1

Verwenden & dafür UND-Operationen bei Q Objekte.

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

Verwendeter & operator druckt dennoch die E-Mail-Adresse Ich habe nicht nach – uche

+0

gesucht Beachten Sie, dass wir 'iexact' verwendet haben, das eine Übereinstimmung zwischen Groß- und Kleinschreibung berücksichtigen sollte POs den Code des Bestellcodes. –

+0

@uche den Benutzermodellcode eingeben. –