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)

现在我需要在此模型中按字段 dateusername 进行搜索。我有一个表单,它以 date_fromdate_tousername 作为输入。任何字段都可以为空。如果 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在具有多个值的多个字段中搜索的主要内容,如果未能解决你的问题,请参考以下文章

多个模型中的 Django 搜索字段

如何使用 QuerySets 和 MySql“全文搜索”在多个字段中进行 Django 搜索?

具有多个值的 FIND_IN_SET

使用具有多个值的EasyAutocomplete插件自动完成搜索输入

选择具有多个重复字段值的行

使用可变数量的参数过滤多个 Django 模型字段