Django ORM操作
Posted believepd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django ORM操作相关的知识,希望对你有一定的参考价值。
一、一般操作
all() 查询所有结果 filter(**kwargs) 它包含了与所给筛选条件相匹配的对象 get(**kwargs) 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误 exclude(**kwargs) 它包含了与所给筛选条件不匹配的对象 values(*fields) 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列 values_list(*fields) 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 order_by(*fields) 对查询结果排序 reverse() 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法) distinct() 从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重) count() 返回数据库中匹配查询(QuerySet)的对象数量 first() 返回第一条记录 last() 返回最后一条记录 exists() 如果QuerySet包含数据,就返回True,否则返回False
返回QuerySet的方法
all()、filter()、exclude()、order_by()、reverse()、distinct()
返回QuerySet的两个特殊方法
values() 返回一个可迭代的字典序列
values_list() 返回一个可迭代的元祖序列
models.Publisher.objects.values("name") # <QuerySet [{‘name‘: ‘上海出版社‘}, {‘name‘: ‘丽江出版社‘}]> models.Publisher.objects.values_list("name") # <QuerySet [(‘上海出版社‘,), (‘丽江出版社‘,)]> # 不写字段名,默认查询所有字段
返回数据库中具体对象的方法
get()、first()、last()
返回布尔值的方法:exists()
obj = models.Publisher.objects.exists() print(obj) # True
返回数字的方法:count()
单表查询之双下划线
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1且小于10的值 models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据 models.Tb1.objects.exclude(id__in=[11, 22, 33]) # 获取id除了11、22、33的数据 models.Tb1.objects.filter(name__contains="ven") # 获取name字段包含"ven"的数据 models.Tb1.objects.filter(name__icontains="ven") # 前面有i的,不区分大小写,如"VEN"、"Ven"、"vEN"都能获取到 models.Tb1.objects.filter(id__range=[1, 3]) # 获取id范围是1到3的数据,等价于SQL的 bettwen and 类似的还有:startswith,istartswith, endswith, iendswith date字段还可以: models.Class.objects.filter(birthday__year=2018)
二、ForeignKey操作
2.1 正向查找
2.1.1 对象查找(跨表)
语法:对象.关联字段.字段
book_obj = models.Book.objects.first() # 第一本书对象 print(book_obj.publisher) # 得到这本书关联的出版社对象 print(book_obj.publisher.name) # 得到出版社对象的名称
2.1.2 字段查找(跨表)
语法:关联字段__字段
pub_obj = models.Book.objects.values_list("publisher__name")[0] print(pub_obj[0]) # 北京出版社
2.2 反向查找
2.2.1 对象查找
语法:obj.表名_set
pub_obj = models.Publisher.objects.first() # 找到第一个出版社对象 book = pub_obj.book_set.all() # 找到第一个出版社出版的所有书 print(book) # <QuerySet [<Book: Book object>]> title = book.values_list("title") # 找到第一个出版社出版的所有书的书名 print(title) # <QuerySet [(‘遮蔽的天空‘,)]>
PS:如果像下面那样设置,则不需要使用 obj.表名_set,而是 obj.表名 即可
# 这个即可 book = pub_obj.book_set.all() # 改成 book = pub_obj.book.all()
2.2.2 字段查找
语法:表名__字段
book_obj_title = models.Publisher.objects.values_list("book__title")
三、ManyToManyField操作
class RelatedManager
"关联管理器"是在一对多或者多对多的关联上下文中使用的管理器。
它存在于下面两种情况:
- 外键关系的反向查询
- 多对多关联关系
简单来说就是当 点后面的对象 可能存在多个的时候就可以使用以下的方法。
方法
create()
创建一个新的对象,保存对象,并将它添加到关联对象集之中,返回新创建的对象。
# 通过作者创建一本书,会自动保存 author_obj = models.Author.objects.first() author_obj.book.create(title="Python", price=99, store=100, sale=10, publisher_id=2)
add()
把指定的model对象添加到关联对象集中。
给作者添加一本已经存在的书:
author_obj = models.Author.objects.filter(id=5)[0] book = models.Book.objects.filter(id=4)[0] author_obj.book.add(book)
给作者添加多本已经存在的书:
author_obj = models.Author.objects.filter(id=3)[0] book = models.Book.objects.filter(id__gt=6) author_obj.book.add(*book)
直接添加书的id
author_obj = models.Author.objects.filter(id=2)[0] author_obj.book.add(3)
author_obj.book.add(*[1,2])
set()
更新(重置)model对象的关联对象。
author_obj = models.Author.objects.first()
author_obj.book.set([4,5])
remove()
从关联对象集中移除执行的model对象
author_obj = models.Author.objects.filter(id=1)[0] author_obj.book.remove(4) author_obj.book.remove(5)
clear()
从关联对象集中移除一切对象。
author_obj = models.Author.objects.filter(id=2)[0]
author_obj.book.clear()
注意:
对于ForeignKey对象,clear() 和 remove() 方法仅在 null=True 时存在。
示例:
ForeignKey字段没设置null=True时,没有 clear() 和 remove() 方法:
class Book(models.Model): title = models.CharField(max_length=32) publisher = models.ForeignKey(to="Publisher")
>>>models.Publisher.objects.first().book_set.clear() Traceback (most recent call last): File "E:/untitled/ORMTEST.py", line 12, in <module> models.Publisher.objects.first().book_set.clear() AttributeError: ‘RelatedManager‘ object has no attribute ‘clear‘
当 ForeignKey 字段设置 null=True 时,就有 clear() 和 remove() 方法:
models.Publisher.objects.first().book_set.clear()
上面代码表示拿到这个 publisher 对象,然后反向操作清空所有属于自己出版的书;即原本属于这个出版商出版的书的 publisher_id 被设置为 null 了。
注意:
对于所有类型的关联字段,add()、create()、remove()、clear()、set() 都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调用 save() 方法。
1
以上是关于Django ORM操作的主要内容,如果未能解决你的问题,请参考以下文章