1.新建一个对象的方法有以下几种:
-
Person.objects.create(name=name,age=age)
-
p = Person(name="WZ", age=23)
p.save()
-
p = Person(name="TWZ")
p.age = 23
p.save()
-
Person.objects.get_or_create(name="WZT", age=23)
这种方法是防止重复很好的方法,但是速度要相对慢些,返回一个元组,第一个为Person对象,第二个为True或False, 新建时返回的是True, 已经存在时返回False.
当有一对多,多对一,或者多对多的关系的时候,先把相关的对象查询出来
>>>
from
blog.models
import
Entry
>>> entry
=
Entry.objects.get(pk
=
1
)
>>> cheese_blog
=
Blog.objects.get(name
=
"Cheddar Talk"
)
>>> entry.blog
=
cheese_blog
>>> entry.save()
2.获取对象有以下方法:
-
Person.objects.all()
-
Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存
-
Person.objects.get(name=name)
get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter
-
Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
-
Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
-
Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
-
Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写
-
Person.objects.filter(name__regex="^abc") # 正则表达式查询
-
Person.objects.filter(name__iregex="^abc")# 正则表达式不区分大小写
filter是找出满足条件的,当然也有排除符合某条件的
-
Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
-
Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的
3. QuerySet 是可迭代的
es
=
Entry.objects.
all
()
for
e
in
es:
print
(e.headline)
注意事项:
(1). 如果只是检查 Entry 中是否有对象,应该用 Entry.objects.all().exists()
(2). QuerySet 支持切片 Entry.objects.all()[:10] 取出10条,可以节省内存
(3). 用 len(es) 可以得到Entry的数量,但是推荐用 Entry.objects.count()来查询数量,后者用的是SQL:SELECT COUNT(*)
(4). list(es) 可以强行将 QuerySet 变成 列表
>>>
import
pickle
>>> query
=
pickle.loads(s)
# Assuming 's' is the pickled string.
>>> qs
=
MyModel.objects.
all
()
>>> qs.query
=
query
# Restore the original 'query'.
Author.objects.
all
().order_by(
'name'
)
Author.objects.
all
().order_by(
'-name'
)
# 在 column name 前加一个负号,可以实现倒序
Author.objects.
filter
(name__contains
=
"WeizhongTu"
).
filter
(email
=
"tuweizhong@163.com"
)
Author.objects.
filter
(name__contains
=
"Wei"
).exclude(email
=
"tuweizhong@163.com"
)
# 找出名称含有abc, 但是排除年龄是23岁的
Person.objects.
filter
(name__contains
=
"abc"
).exclude(age
=
23
)
Person.objects.
all
()[:
10
] 切片操作,前
10
条
Person.objects.
all
()[
-
10
:] 会报错!!!
# 1. 使用 reverse() 解决
Person.objects.
all
().reverse()[:
2
]
# 最后两条
Person.objects.
all
().reverse()[
0
]
# 最后一条
# 2. 使用 order_by,在栏目名(column name)前加一个负号
Author.objects.order_by(
'-id'
)[:
20
]
# id最大的20条
qs1
=
Pathway.objects.
filter
(label__name
=
'x'
)
qs2
=
Pathway.objects.
filter
(reaction__name
=
'A + B >> C'
)
qs3
=
Pathway.objects.
filter
(inputer__name
=
'WeizhongTu'
)
# 合并到一起
qs
=
qs1 | qs2 | qs3
这个时候就有可能出现重复的
# 去重方法
qs
=
qs.distinct()