2017-06-05 5 views
0

Ich habe ein Modell, das für Benutzer Login Logout-Zeit und Datum gespeichertDjango Suche in mehreren Feldern mit mehrere Wert

class LoginLogout(models.Model): 
    username = models.CharField(max_length=30, unique=True) 
    date = models.DateField(auto_now_add=True) 
    login_time = models.TimeField() 
    logout_time = models.TimeField(null=True, blank=True) 

Jetzt muß ich durch das Feld Datum und Benutzername in diesem Modell suchen. Ich habe ein Formular, das date_von, date_to und username als Eingabe dauert. Jedes Feld kann leer sein. Wenn Benutzername ist leer werden alle Ergebnisse zurückgegeben. Was wird nun das Abfrage-Set sein, um das gewünschte Abfrage-Set zu erreichen?

Antwort

1

Ich muss in diesem Modell nach dem Feld Datum und Benutzernamen suchen. Ich habe ein Formular, das date_from, date_to und username als Eingabe verwendet.

Sie möchten mehr über Django's query expressions erfahren.

events = LoginLogout.objects.filter(
     username=username, 
     date__ge=date_from, 
     date__le=date_to, 
) 

Jedes Feld kann leer sein. Wenn der Benutzername leer ist, werden alle Ergebnisse zurückgegeben.

Dies sind besondere Bedingungen und sollten in Ihrem Code so dargestellt werden.

filter_args = {} 
if username: 
    filter_args['username'] = username 
    if date_from: 
     filter_args['date__ge'] = date_from 
    if date_to: 
     filter_args['date__le'] = date_to 
events = LoginLogout.objects.filter(**filter_args) 
+0

das ist leise sauber und macht die Arbeit. Vielen Dank –

1

Dies sollte die Arbeit machen:

if not username: 
    return LoginLogout.objects.all() 
else: 
    return LoginLogout.objects.filter(date__gte=date_from, 
             date__lte=date_to, 
             username=username) 
0

Sie, wenn sonst viele verwenden ...

i Sie nur die

# Case 1: All res: 
res = LoginLogout.objects.all() 
# Case 2: date_to is blank: 
res = LoginLogout.objects.filter(login_time__gt = date_from) 
# Case 3: date_from is blank 
res = LoginLogout.Objects.filter(logout_time__lt = date_to) 
# Case 4: all value 
res = LoginLogout.Objects.filter(Q(username= username) & Q(login_...) & Q(logout_...) 
# Or: 
res = LoginLogout.Objects.filter(username= username, login_time__gt = ...) 
+0

Danke für Ihre Antwort. Aber ich wünschte, viele andere zu vermeiden. –

+0

Sir, Sie können nicht die harte Arbeit für den Benutzer geben. Du musst es auf deiner Seite haben. Und wenn du nicht zu viel willst, sonst. Setzen Sie einfach DEFAULT Wert für die Daten (wie: logout_time = jetzt, login_time = 1970 ....) es ist auch ez weg –

0

Abfrage geben versuchen, diese:

from django.db.models import Q 

if username or date_from or date_to: 
    LoginLogout.objects.filter(
           Q(username=username), 
           Q(date__gt='date_from'), 
           Q(date__lt='date_to') 
          ) 
else: 
    LoginLogout.objects.all() 
Verwandte Themen