【问题标题】:Django search in multiple field with multiple valueDjango在具有多个值的多个字段中搜索
【发布时间】: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空白,则将返回所有结果。现在实现所需查询集的查询集是什么。

【问题讨论】:

    标签: django model django-queryset


    【解决方案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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多