Django之Q()对象

2017-10-12  本文已影响0人  lxy_悦

一般,在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

操作

# 查询 "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作者>]
# 查询 "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');
上一篇下一篇

猜你喜欢

热点阅读