一般,在Django的查詢數(shù)據(jù)庫的操作都是在QuerySet里進(jìn)行的脱吱,如下所示:
answersheet_objs = answersheet_objs.filter(
message_from_xref_id__isnull=True,
paper_id__in=paper_ids
).exclude(date_lte=datetime.date.today())
但是當(dāng)條件越來越多智政,篩選越來越復(fù)雜的時(shí)候,各種組合查詢糅雜在一起的時(shí)候箱蝠,filter就可能沒辦法滿足我們的查詢续捂。而 Q() 對(duì)象就是為了將這些條件組合起來的垦垂。以下來看個(gè)示例:
書籍表(建表語句在本文最后面):
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
)
表中的數(shù)據(jù):
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
# 輸出結(jié)果:
[<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
# 輸出結(jié)果:
[<Book: book_name=語文 author=A作者>, <Book: book_name=數(shù)學(xué) author=B作者>]
- 非(~)
# 查詢不是 “B作者”的書籍
query = ~Q (author='B作者')
res_a = Book.objects.filter(query)
print res_a
# 等同于
Book.objects.exclude(author='B作者')
# 輸出結(jié)果:
[<Book: book_name=語文 author=A作者>, <Book: book_name=英語 author=C作者>, <Book: book_name=化學(xué) 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作者', '清華大學(xué)出版社', '2017-10-01', '2017-10-01');