-
一般在Django程序中查询数据库操作都是在QuerySet里进行的:
q1 = Entry.objects.filter(headline__startswith="What") q2 = q1.exclude(pub_date__gte=datetime.date.today()) q3 = q1.filter(pub_date__gte=datetime.date.today())
-
获取ORM对应的sql:
代码:
>>> queryset = Event.objects.all() >>> str(queryset.query) SELECT "events_event"."id", "events_event"."epic_id","events_event"."details", "events_event"."years_ago" FROM "events_event"
-
multiple criteria【评价或做决定的标准,准则,原则】符合多条件【文盲笔记】
-
执行AND操作:
-
filter(<condition_1>, <condition_2>)
-
queryset_1 & queryset_2
-
filter(Q(<condition_1>) & Q(<condition_2>))
多个Q()对象之间的关系Django会自动理解成“且(and)”关系
News.objects.get( Q(question__startswith='Who'), Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)) ) # 对应的SQL语句可以理解为: SELECT * from news WHERE question LIKE 'Who%' AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')
-
-
Django filter中使用or(Django中Q)
filter(kwargs) //返回一个匹配查询参数的新的结果集.
filter(~Q(kwargs)) //返回一个不匹配查询参数的新的结果集.
exclude(kwargs) //返回一个不匹配查询参数的新的结果集.
将filter与or联系起来:
from django.db.models import Q
q=Q(question_startswith="What")
```
-
使用符号 & 或者 | 将多个Q()对象组合起来传递给filter(),exclude(),get()等函数。
当多个Q()对象组合起来时,Django会自动生成一个新的Q():user.object.filter(Q(question__startswith='Who') | Q(question__startswith='What'))
【注意】查询表中question以‘who’或者‘what’开头的用户
```
Q(question__startswith='Who') | Q(question__startswith='What')
#这条对应的sql语句如下
WHERE question LIKE 'Who%' OR question LIKE 'What%'
```
-
可以在Q()对象前面使用字符“~”来表达“非”
# 查询表中question以‘who’开头的用户或者pub_date不是2005年的数据 Q(question__startswith='Who') | ~Q(pub_date__year=2005) # 对应SQL语句可以理解为: WHERE question like "Who%" OR year(pub_date) !=2005
-
Q()对象可以结合关键字参数一起传递给查询函数,注意的是要将Q()对象放在关键字参数的前面
#正确的做法 News.objects.get( Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)), question__startswith='Who') #错误的做法,代码将关键字参数放在了Q()对象的前面。 News.objects.get( question__startswith='Who', Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))
-
Q()传入条件查询
con = Q() q1 = Q() q1.connector = 'OR' q1.children.append(('name', "cox")) q1.children.append(('name', "Tom")) q1.children.append(('name', "Jeck")) q2 = Q() q2.connector = 'OR' q2.children.append(('age', 12)) con.add(q1, 'AND') con.add(q2, 'AND') models.Author.objects.filter(con) # 在Author表中,name等于cox/Tom/Jeck的 并且 满足age等于12 的所有数据
-
union组合来自相同或不同模型的两个查询集:
union运算符用于组合两个或多个查询集的结果集。
只有具有相同字段和数据类型的查询集才能执行union操作
查询集可以来自相同或不同的模型。
当它们的查询集来自不同的模型时,可截取部分字段,此时字段及其数据类型应该匹配。 -
使用F()表达式
每次获取times当前的值,再+1,这样需要将times值取出,存到内存中
obj = models.Test.objects.get(name="cox") obj.times = obj.times + 1 obj.save() obj.save() obj.save() obj.save() # 如果times的值是1,那么经过n次save()之后,times的值是2