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}
 
可以生成不止一个聚合,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: 橘子物语>]>
事物:
满足则成功执行 ,不满足,则不执行
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操作的主要内容,如果未能解决你的问题,请参考以下文章

Django models ORM基础操作--白话聊Django系列

Django - ORM操作

Django之ORM

Django基础之django ORM单表操作

Django基础之django ORM单表操作

django之ORM数据库操作