2017-06-05 70 views
0

我有一个存储用户Django的搜索与多个值

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) 

现在我需要由现场日期用户名在这个模型中,以搜寻注销时间和日期的典范。我有一个表格,以date_fromdate_to用户名作为输入。任何字段都可以是空白的。如果用户名空白所有结果将被返回。现在什么是实现所需查询集的查询集。

回答

1

我需要在此模型中按字段日期和用户名搜索。我有一个表单,它将date_from,date_to和username作为输入。

您想了解Django's query expressions

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

任何字段可以是空白。如果用户名空白,所有结果将被返回。

这些都是特殊情况,应该在代码中表示为这样。

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

。谢谢 –

1

这应该做的工作:

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

,你必须使用很多的if else ...

我只是给你查询

# 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

感谢您的回答。但是我希望避免很多其他事情。 –

+0

先生,你不能为用户付出艰苦的努力。你必须在你身边。如果你不想太多,否则。只需为数据设置DEFAULT值(例如:logout_time = now,login_time = 1970 ....),这也是安静干净的工作,也就是 –

0

试试这个:

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()