django orm操作
Posted lnrick
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django orm操作相关的知识,希望对你有一定的参考价值。
返回的是Queryset的方法:
all() 全部
filter() 返回的是列表,没有是none
values() Queryset 元素是字典 不写参数默认全部字段 写参数拿到字段指定的参数
values_list() Queryset 元素是元组 不写参数默认全部字段值 写参数拿到指定的参数
order_by() 按字段顺序查询
distinct() 去重 去重是对结果中同一个对象进行去重,不是所有字段的值都相等就是同一个对象。
reverse()对已经排序的QuerySet进行排序,1,是order_by 2,在创建表的时候加上
class Meta:
ordering = (‘id‘,)
exclude()获取不满足条件的全部对象(反转)
返回的是对象
get() 获取单个对象,空和多个值会报错
first() 获取QuerySet的第一个值
last() 获取QuerySet的最后一个值
返回的是布尔值
exists() 查询是否有有值
返回的是数字
count() 返回的是数字
双下划线:刚刚好尴尬,明明是双下滑线,和抽风一样就写一个,光报错
ret = models.Person.objects.filter(id__lt=3) # less than 小于,和linux 其中的几个相似
ret = models.Person.objects.filter(id__gt=3) # great than 大于
ret = models.Person.objects.filter(id__gte=3) # great than equel 小于等于
ret = models.Person.objects.filter(id__lte=3) # great than equel 大于等于
ret = models.Person.objects.filter(id__gte=3, id__lte=5)
ret = models.Person.objects.exclude(id__gt=5)
ret = models.Person.objects.filter(id__in=[1, 3, 5]) 包含
ret = models.Person.objects.exclude(id__in=[1, 3, 5])
ret = models.Person.objects.filter(id__gte=1, id__lte=100) < 值<
ret = models.Person.objects.filter(id__range=[1, 5]) 之间的值,
ret = models.Person.objects.filter(name__contains=‘A‘) 包含有
ret = models.Person.objects.filter(name__icontains=‘a‘) 不区分大小写
ret = models.Person.objects.filter(name__istartswith=‘a‘) 以什么开头
ret = models.Person.objects.filter(name__endswith=‘x‘) 以什么结尾
ret = models.Person.objects.filter(birth__year=‘2018‘) 查询是2018年的
ret = models.Person.objects.filter(birth__month=‘09‘)
ret = models.Person.objects.filter(name__isnull=True)
外键查询:
正向查询:
基于对象查询
正向查询 book ——》 publisher
# book_obj = models.Book.objects.get(id=1)
# print(book_obj.id)
# print(book_obj.title)
# print(book_obj.publisher_id)
# print(book_obj.publisher_id) # 关联的出版社对象
# print(book_obj.publisher.id) # 关联的出版社对象
# print(book_obj.publisher.name)
基于字段查询
# ret= models.Book.objects.filter(publisher__name=‘沙河出版社‘)
# ret= models.Book.objects.filter(publisher_id=1)
# print(ret)
反向查询: publisher ——》 book
基于对象的查询:
pub_obj = models.Publisher.objects.first() 获取对象
1
书名小写_set:
print(pub_obj)
# ret = pub_obj.book_set.all()
# print(pub_obj.book_set,type(pub_obj.book_set))
# print(ret)
2
related_name books
# print(pub_obj.books.all()) 指定了名字
基于字段的查找
ret = models.Publisher.objects.filter(xx__title=‘跟太亮学开车‘)
print(ret)
多对多
create() 创建新的对象,并将它添加到关联的对象集中,返回创建的对象集
add() 把指定的model对象添加到关联的对象集中,如果是QuerySet的话,*obj,数字id或者对象,单独add,或者对象 关联关系
set()用的多,可以清空,可以更新添加元素的时候[] 或者对象列表
remove() 一个对象,多个的话需要*obj 关联关系, 在一对多中,多要求models:null=Ture,不能使用id,要使用obj
clear()从关联集中中移出一切
# author_obj.books.create(title=‘戴绿与嫂子的故事‘,publisher_id=1)
# 1. 创建书籍对象(与出版社进行关联)
# 2. 该对象和作者进行关联
pub_obj= models.Publisher.objects.first()
# pub_obj.book_set
# pub_obj.books.create(title=‘跟老男孩学思想‘) 在外键上设置
related_name
set
# author_obj.books.set([1,6,8,9])
# author_obj.books.set(books)
# author_obj.books.remove(*books)
# author_obj.books.clear()
pub_obj = models.Publisher.objects.get(id=1)
# 一对多的管理对象remove不能使用id 使用对象
# pub_obj.books.remove(models.Book.objects.get(id=5))
pub_obj.books.clear()
聚合:aggregate()
from django.db.models import Avg, Sum, Max, Min, Count
aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。
如果想要给聚合指定一个名称,可以向聚合子句提供它
models.Book.objects.aggregate(average_price=Avg(‘price‘))
{‘average_price‘: 13.233333}
{‘average_price‘: 13.233333}
可以生成不止一个聚合,models.Book.objects.all().aggregate(Avg("price"), Max("price"), Min("price")) 注意使用时先是默认值,后是关键字
分组:annotate
F查询:自己表中的多个数据
1,可以在自己表中进行比较
models.Book.objects.filter(commnet_num__lt=F(‘keep_num‘)*2
2,修改操作,
models.Book.objects.all().update(price=F("price")+30)
Q,查询:|相当于或 &相当于和 注意~Q取反
1,models.Book.objects.filter(Q(authors__name="小仙女")|Q(authors__name="小魔女"))
查询出版年份是2017或2018,书名中带物语的所有书。
>> models.Book.objects.filter(Q(publish_date__year=2018) | Q(publish_date__year=2017), title__icontains="物语")
<QuerySet [<Book: 番茄物语>, <Book: 香蕉物语>, <Book: 橘子物语>]>
<QuerySet [<Book: 番茄物语>, <Book: 香蕉物语>, <Book: 橘子物语>]>
事物:
满足则成功执行 ,不满足,则不执行
from django.db import transaction
try:
with transaction.atomic():
models.Book.objects.create(title=‘xxx1‘, price=‘111‘, publisher_id=1)
models.Book.objects.create(title=‘xxx‘, price=‘111‘, publisher_id=100)
except Exception as e:
print(str(e))
一对一的:
OneToOneField(to=‘关联的表‘)(一对一)
在ForeignKey基础上加一个束缚 unique=true
所有的内容可以写在一个表中
有的字段不常查,但有的字段查的很频繁
单表的增删改查中:
update() 只更新那个字段
和获取到对象在进行添加区别 更新所有的字段
以上是关于django orm操作的主要内容,如果未能解决你的问题,请参考以下文章