一般,在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');
网友评论