美文网首页
Django之Q()对象

Django之Q()对象

作者: lxy_悦 | 来源:发表于2017-10-12 14:57 被阅读0次

    一般,在Django的查询数据库的操作都是在QuerySet里进行的,如下所示:

    answersheet_objs = answersheet_objs.filter(
          message_from_xref_id__isnull=True,
          paper_id__in=paper_ids
    ).exclude(date_lte=datetime.date.today())
    

    但是当条件越来越多,筛选越来越复杂的时候,各种组合查询糅杂在一起的时候,filter就可能没办法满足我们的查询。而 Q() 对象就是为了将这些条件组合起来的。以下来看个示例:

    书籍表(建表语句在本文最后面):

    class Book(models.Model):
        name = models.CharField(max_length=255)
        author = models.CharField(max_length=255)
        press = models.CharField(max_length=255)
        pub_date = models.DateField(auto_now_add=True)
        update_time = models.DateField(auto_now=True)
    
        def __unicode__(self):
            return u'book_name={name} author={author}'.format(
                name=self.name,
                author=self.author
            )
    

    表中的数据:

    image.png

    操作

    • and (&)
    # 查询 "A作者" 的 "语文" 书籍
    query = Q(name='语文') & Q(author='A作者')
    query_a = Q(name='语文', author='A作者')    # 等同于上面的query
    res_a = Book.objects.filter(query_a)
    print res_a
    
    # 输出结果:
    [<Book: book_name=语文 author=A作者>]
    
    • or ( | )
    # 查询 "A作者" 的 "语文"书  或者 “B作者”的书籍
    query = Q(name='语文', author='A作者') | Q (author='B作者') 
    res_a = Book.objects.filter(query)
    print res_a
    
    # 输出结果:
    [<Book: book_name=语文 author=A作者>, <Book: book_name=数学 author=B作者>]
    
    • 非(~)
    # 查询不是 “B作者”的书籍
    query = ~Q (author='B作者') 
    res_a = Book.objects.filter(query)
    print res_a
    
    # 等同于
    Book.objects.exclude(author='B作者')
    
    # 输出结果:
    [<Book: book_name=语文 author=A作者>, <Book: book_name=英语 author=C作者>, <Book: book_name=化学 author=A作者>]
    

    建表SQL:

    CREATE TABLE `myapp_book` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL,
      `author` varchar(255) NOT NULL,
      `press` varchar(255) NOT NULL,
      `pub_date` date NOT NULL,
      `update_time` date NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
    
    插入语句示例:
    INSERT INTO `test`.`myapp_book` (`name`, `author`, `press`, `pub_date`, `update_time`) VALUES ('语文', 'A作者', '清华大学出版社', '2017-10-01', '2017-10-01');
    

    相关文章

      网友评论

          本文标题:Django之Q()对象

          本文链接:https://www.haomeiwen.com/subject/ooenyxtx.html