orm操作

import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "publish.settings")
import django
django.setup()
from app_01 import models
# 1. all()查询所有结果。条件查询默认跟随all(),不写也行
ret1 = models.Book.objects.all()

# 2. filter(**kwargs) 返回筛选条件的列表形式的queryset对象,通过索引得到指定对象;不存在不报错,返回空列表.
ret = models.Book.objects.filter(id=5)[0].title
# 3.get(**kwargs)返回指定对象,不存在报错
ret = models.Book.objects.get(id=5)
# 4.exclude(**kwargs) 不包含指定条件的queryset对象
ret = models.Book.objects.exclude(id=1)
# 5.values(*field)返回queryset对象,内部为字典,键是字段名,值是字段名对应值
ret = models.Book.objects.values("id","title")
# 6.values_list(*field) 与values类似,返回的是指包含值的元组
ret = models.Book.objects.values_list("id","title")
# 7.order_by(**kwargs) 查询结果排序
ret = models.Book.objects.order_by("title")
# 8.reverse()
ret = models.Book.objects.order_by("title").reverse()
# 9.distint
ret = models.Book.objects.values_list("author__name")
ret = models.Book.objects.values_list("author__name").distinct()
# 10.count()返回满足条件的个数
ret = models.Book.objects.count()

# 11.first()返回第一条记录
ret = models.Book.objects.first()
# 12.last()返回最后一条记录
ret = models.Book.objects.last()
# 13.exist()判断queryset是否存在数据
ret = models.Book.objects.filter(id=5).exists()

# 双下划綫方法:
# 1.__lt小于,__lte小于等于,__gt大于,__gte大于等于
ret = models.Book.objects.filter(id__lte=5)
# 2.__in在指定列表内
ret = models.Book.objects.filter(id__in=[1,3,5,7,9])
# 3.__contains包含,__icontains大小写不敏感
ret = models.Book.objects.filter(title__contains="法")
# 4.__range区间左右闭区间,__startwith已某个字符开始,区分大小写。__istartwith不区分大小写
ret = models.Book.objects.filter(title__istartswith ="e")
# 5.date字段可以拆分
ret = models.Book.objects.filter(date__year=2019)

# 外键跨表查询
# 1.正向查询
# 1.对象.关联字段.字段
obj = models.Book.objects.filter(id=5)
ret = obj[0].publisher.publisher

# 2.关联字段__字段(只能是queryset对象使用)
ret = models.Book.objects.values_list("publisher__publisher")
ret =obj.values("publisher__publisher")

# 3.类定义时使用了related_query_name时:
# ret = models.Book.objects.filter(pl1__publisher)


# 2.反向查询
# 1.obj.关联表名_set,obj是具体对象,只能得到一个值,返回的是queryset对象,通过values得到具体字段值.在类中未定义related_name时使用
publisher_obj = models.Publisher.objects.first()
ret = publisher_obj.book_set.all()
# (related_name作为反向表名直接使用,related_query_name 是跟__字段使用,都代替的是外键所在的表名)
# 当定义类使用related_name时,可以直接使用该名字取代跨表表达方式.(related_name作为反向表名直接使用)
# ret = publisher_obj.publishers2.filter(id=8) # 第一个出版社出版的 书的id为8 的对象(书)
# 当定义类使用related_query_name时,使用 该名字__跨表字段名查询,未定义时使用related_name
# ret = models.Publisher.objects.filter(publishers3__title ="英语") # 在出版社中查询 书的id为8 的出版社对象(出版社)
ret = models.Book.objects.filter(title="英语").values("publisher__publisher")#与上一条对比

# 2.关联表名__字段(不加字段名得到的是反向查询对象)
ret = models.Publisher.objects.filter(id=1).values_list("book__title")

# 3.删除和清空(只有在外键设置为 null= true 时可以使用)
# 两者都要指定对象才能使用
publisher_obj = models.Publisher.objects.get(id=3)
book_obj = models.Book.objects.filter(title="english")
# publisher_obj.book_set.remove(*book_obj)
# publisher_obj.book_set.clear()


# 多对多操作
author_obj = models.Author.objects.first()
# 1.all() 匹配所有关联结果
ret = author_obj.book.all()

# 2.create()创建关联,自动保存提交
# 1)在book中创建一本新书
# 2)在author_book关系表中添加一条关系数据
# author_obj.book.create(title = "政治", publisher_id =2 )

# 3.add()在现有关系中增加一条关系
# 1)添加具体对象,不能是只有一个值的queryset对象
book_obj = models.Book.objects.get(id =15 )
# author_obj.book.add(book_obj)
# 2) 添加queryset对象,需要在变量前添加* 打散列表
book_obj = models.Book.objects.filter(id=16)
# author_obj.book.add(*book_obj)
# 3) 直接指定值
# author_obj.book.add(8)


# 4.remove()
# 1)具体对象
book_obj = models.Book.objects.get(id=15)
# author_obj.book.remove(book_obj)
# 2)指定值
# author_obj.book.remove(8)
# 3)queryset对象?
# book_obj = models.Book.objects.filter(id=16)
# author_obj.book.remove(*book_obj)
# 5.clear()

#聚合查询
from django.db.models import Avg, Sum, Max, Min
# 查询书的平均价格,总价,最高价,最低价
ret = models.Book.objects.aggregate(Avg("price"), Sum("price"),Max("price"),Min("price"))
ret = models.Book.objects.aggregate(avg_price=Avg("price"))


# 分组查询(annotate前是什么就按照什么分组)
from django.db.models import Count
# 查询每个作者写了几本书
ret = models.Author.objects.annotate(book_num=Count("book"))
# for author in ret:
# print(author.name, author.book_num)

# 查询每个作者书的总价
ret = models.Author.objects.annotate(sum_price=Sum("book__price")) # Sum并非必须在aggregate中使用
for author in ret:
print(author.name, author.sum_price)
ret = models.Author.objects.values("name").annotate(sum_price=Sum("book__price"))
print(ret)
# 查询每本书的作者个数
ret = models.Book.objects.annotate(author_num=Count("author__name"))
# for book in ret:
# print(book.title, book.author_num)

# F查询:
from django.db.models import F
ret = models.Book.objects.filter(inventory__lt=F("sold"))
# 批量更改数值类
# ret = models.Book.objects.update(sold=((F("sold")+1)*3))
# 批量更改文字
from django.db.models.functions import Concat,Substr
from django.db.models import Value
# 在每本书名后增加(“第一版")
# ret = models.Book.objects.update(title = Concat(F("title"),Value("(第一版)")))
# 返回书名的前十个字符作为书名
# models.Book.objects.update(title=Substr("title",1,10))

# Q查询:
from django.db.models import Q
# 表示或者关系,~表示非
ret = models.Book.objects.filter(Q(price__gt=30)|~Q(inventory__lt=17))
# print(ret)

# 事务
try:
from django.db import transaction
with transaction.atomic():
models.Book.objects.create(title="专业英语")
models.Book.objects.get(id=1)
except Exception as e:
print(e)

# 批量生成

# book_objs = [models.Book(title="中华上下五千年---{}".format(i)) for i in range(10000)]
# models.Book.objects.bulk_create(book_objs,10)#后面的数字表示一次生成10条,可以不写
models.Book.objects.filter(id__in=range(10000,100000)).delete()
posted @ 2019-02-21 16:18  modengdai  阅读(160)  评论(0编辑  收藏  举报