【问题标题】:How to create Django custom query?如何创建 Django 自定义查询?
【发布时间】:2014-09-06 16:56:45
【问题描述】:

我有一个名为 UserInfo 的模型,其中包含以下字段: 身份证、姓名、号码

我想创建一个自定义搜索页面。这将具有以下元素: 搜索框、搜索按钮 与 NAME 匹配的文本字段 要匹配 NUMBER 的文本字段

它应该如何工作: 假设我在相应的文本框中输入“John”作为名称,输入“1234”作为数字,然后单击搜索。结果应该向我显示名称为“John”且编号为“1234”的条目。

我猜查询类似于以下内容: UserInfo.objects.filter(name='John').filter(number='1234')

我以前在 PHP 中进行过此类查询,但在 Django 中不起作用。我想知道我可以使用什么代码在查询中关联多个过滤器,以便如果在名称和数字文本框中都有数据输入,我会得到类似上面的查询,但如果我只搜索名称,则查询变为: UserInfo.object.filter(name='John') 而不是

UserInfo.object.filter(name='John').filter(number='')

应该有一个简单的解决方案,我不知道。很混乱。 :-/

【问题讨论】:

    标签: mysql django search filter


    【解决方案1】:

    Q 是 Django 中的一个强大功能。见Q class

    from django.db.models import Q
    
    # you cand do a lot of crazy things here 
    query = Q(name__iexact=name) & Q(number=number)
    
    users =  UserInfo.object.filter(query)
    

    【讨论】:

      【解决方案2】:

      过滤器方法是可链接的,不可变的:)

      def search_user(name=None, number=None):
      
          # Uncomment the following lines to return NO records when no input.
          # if not name and not number:
          #    return  UserInfo.objects.none()
      
          qs = UserInfo.objects.all()
          if name:
              qs = qs.filter(name=name)
          if number:
              qs = qs.filter(number=number)
          return qs
      

      如果没有输入,此示例将返回 所有 记录。

      (注意 QS 是惰性的,all() 不会检索所有记录,除非稍后访问。)

      【讨论】:

      【解决方案3】:

      我会做这样的事情

      if name and number:
          UserInfo.object.filter(name='John',number='1234')
      

      【讨论】:

        【解决方案4】:

        根据您的示例的解决方案是...

        MatchedUsers = UserInfo.object.filter(name='John',number='1234')
        return MatchedUsers
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-14
          • 1970-01-01
          • 2014-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多