Django在具有多个值的多个字段中搜索
Posted
技术标签:
【中文标题】Django在具有多个值的多个字段中搜索【英文标题】:Django search in multiple field with multiple value 【发布时间】:2017-11-06 00:26:49 【问题描述】:我有一个模型可以存储用户的登录注销时间和日期
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 和 username 进行搜索。我有一个表单,它以 date_from、date_to 和 username 作为输入。任何字段都可以为空。如果 username 为 空白,则将返回所有结果。现在实现所需查询集的查询集是什么。
【问题讨论】:
【参考方案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)
【讨论】:
【参考方案2】:试试这个:
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()
【讨论】:
【参考方案3】:你必须使用很多 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 = ...)
【讨论】:
感谢您的回答。但我希望避免很多。 先生,您不能为用户付出辛勤的工作。你必须在你身边。如果你不想太多 if,else。只需为数据设置 DEFAULT 值(例如:logout_time = now,login_time = 1970 ....),这太过分了【参考方案4】:这应该可以完成工作:
if not username:
return LoginLogout.objects.all()
else:
return LoginLogout.objects.filter(date__gte=date_from,
date__lte=date_to,
username=username)
【讨论】:
以上是关于Django在具有多个值的多个字段中搜索的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 QuerySets 和 MySql“全文搜索”在多个字段中进行 Django 搜索?