django-orm
常用字段
1 AutoField: 2 自增的整形字段,必填参数primary_key=True,则成为数据库的主键。 3 CharField: 4 5 IntegerField: 6 一个整数类型。数值的范围是 -2147483648 ~ 2147483647。 7 8 DateField: 9 10 DateField: 11 auto_now:每次修改数据的时候,时间都会变成当前时间 12 auto_now_add:只有新创建队形的时候才会改变时间 13 14 参数互斥,不能同时设置 15 16 BooleanField(Field) 17 - 布尔值类型 保存在数据库中是0|1 18 19 NullBooleanField(Field): 20 - 可以为空的布尔值 保存在数据库中是NULL|0|1 21 22 FloatField(Field) 23 - 浮点型 24 25 DecimalField(Field) 26 - 10进制小数 27 - 参数: 28 max_digits,小数总长度 29 decimal_places,小数位长度
自定义字段
1 自定义字段:相当于Mysql中的char类型 2 class MyCharField(models.Field): 3 """ 4 自定义的char类型的字段类 5 """ 6 7 def __init__(self, max_length, *args, **kwargs): 8 self.max_length = max_length 9 super().__init__(max_length=max_length, *args, **kwargs) 10 11 def db_type(self, connection): 12 """ 13 限定生成数据库表的字段类型为char,长度为max_length指定的值 14 """ 15 return 'char(%s)' % self.max_length
Admin创建超级用户
1.在终端输入python manager.py createsuperuser 输入的密码必须:不少于8位_由字母_数字组成 2.注册model 在app01文件的admin。py下 from app01 import models admin.site.register(models.Person) 3.登陆admin网址 4.在settings。py下就显示中文 LANGUAGE_CODE = 'zh-Hans'
字段中参数
null:是否可以为空,默认为False default:默认值 primary_key:设置主键 db_column:相当于起别名,在数据库展示的时候显示的字段名 #db_table:一般为app01_类名小写,设置后改变表名 db_index:该字段作为索引 unique:该字段是否可以建立唯一索引 与admin相关: blank:设置为Ture后,admin可以输入为空 verbose_name:设置后admin显示为设置名字 choices=[(0, '男'),(1, '女'),],default=0:设置后admin为可选项 meta参数: class Meta: # 数据库中生成的表名称 默认 app名称 + 下划线 + 类名 db_table = "person" #admin中显示的表名称 verbose_name = 'admin_person' # admin首页中的表名 verbose_name_plural = '所有用户信息' # # 联合索引 # index_together = [ # ("pub_date", "deadline"), # 应为两个存在的字段 # ] # # # 联合唯一索引 # unique_together = (("driver", "restaurant"),) # 应为两个存在的字段
ORM操作必会13条
all(): 返回表中所有数据--》queryset类型 get(条件):返回符合条件的对象--》对象 查询不到或多个或报错 filter(条件):可以返回多个符合条件的Queryset 查询不到为空 exclues(条件):返回不符合条件的queryset order_by(根据哪个字段进行排序):返回Queryset Queryset.count():返回查询到的个数 QUeryset.first():返回查询结果的第一条数据--》返回的是obj QUeryset.last():返回查询结果的最后一条数据——》返回的是obj Queryset.exists():返回布尔值,有为True,没有False Qureyset.values():返回的是一个表的字典 Queryset.values():返回的是一个query的元组,没有字段 reverse:倒序 distinct:对结果去重,比如去重values_lst('name')的重复 返回QuerySet: all() filter() values() values_list() distinct() reverse() order_by() exclues() 返回对象: get() first() last() 返回数字: count() 返回布尔值: exsits()
单表查询双下方法
单表查询--双下方法: 在filter方法下 pk__gt=1:pk>1 pk_lt=2:pk<2 pk__in=[1,2,3]:获得id等于1,2,3,的数据 pk__range=(1,3):相当于between and 1-3的数据 name__contains='出':表示包含'出'字符的数据 name__icontains='出':表示包含'出'字符的数据(不区分大小写) 类似的:startswith,endswith,istartwith,iendswith,带i的不区分大小写 #obj=models.Publisher.objects.filter(name__contains='出')
外键查询
外键的查询: 基于对象的查找 #正向查找 obj=models.Book.objects.get(pk=1)#筛选出ID为1的book的出版社名称 print(obj.pub.name) # 反向查找 #找出出版社ID为1出版的书 pub_obj=models.Publisher.objects.get(pk=1) # 外键中不指定related_name # 1.pub_obj.关联表名小写_set,得到关系管理对象 print(pub_obj.book_set.all(),type(pub_obj.book_set)) # 外间中指定related_name # 2.pub_obj.外键的related_name得到关系管理对象 print(type(pub_obj.books)) 基于字段的查找 # 正向查找 # 查找人民出版社出版的图书 # 关联字段_字段='值' # obj=models.Book.objects.filter(pub__name='人民出版社') # print(obj) # 反向查找 #站在Publisher的角度找红楼梦的出版社 # 指定related_name=books # 字段设置为:books__name='红楼梦' # obj=models.Publisher.objects.filter(books__name='红楼梦') # print(obj) # 不指定related_name #关联的表名小写__字段 # ojb=models.Publisher.objects.filter(book__name='红楼梦') # print(ojb) 关系管理对象的方法: #必须设置related_name pub_obj=models.Publisher.objects.get(pk=1) #all():查询所有的book对象 #add():添加已有的关系对象 #set():表示设置已有关系,没有设置的对象会变 #remove():移除两者的关系 #clear():清空关系 移除关系的时候注意设置null=True pub_obj.book_set.add(*models.Book.objects.filter(pk=3)) pub_obj.books.remove(*models.Book.objects.filter(pk=2)) pub_obj.books.set(models.Book.objects.filter(pk__in=[1,2,3,7])) pub_obj.books.clear()
多对多
多对多关系查询 # 不指定related_name # 对象查找 # 正向查找 #找吴承恩写的书名字 # au_obj=models.Author.objects.get(pk=1) # print(au_obj.books.values_list('name')) #au_obj,books得到多对多关系对象 # 字段查找 # 找水浒的作者 # print(models.Author.objects.filter(books__name='水浒')[0].name) # 反像查找 # obj=models.Book.objects.get(pk=1) # print(obj.author_set.all()) # 多对多关系管理对象的方法 obj=models.Author.objects.get(pk=1) # obj.books.add(*models.Book.objects.filter(pk=7)) # obj.books.remove(*models.Book.objects.filter(pk=7)) # obj.books.clear() # obj.books.set(models.Book.objects.filter(pk__in=[1,2,3,4]))
聚合
聚合:返回的是键值对的字典 from django.db.models import Max,Min,Sum,Avg,Count #求最贵的图书 model.Book.objects.aggregate(Max('price')) 可以指定键的名字 model.Book.objects.aggregate(max=Max('price')) 可以传多个聚合函数 model.Book.objects.aggrecate(Max('price'),Min('price'))
分组
分组 # 根据出版社分组 # a1=models.Book.objects.values('pub__name').annotate(max=Max('price')).values('pub__name','max') # 求每个出版社出版的书的价格平均值 # a1=models.Publisher.objects.annotate(avg=Avg('books__price')).values('name','avg') # 求每个数由几个作者写的并且筛选出作者的个数大于1的 # a1=models.Book.objects.annotate(count=Count('authors')).filter(count__gt=1).values('name','count') # 求每个出版社最便宜的书的价格 # a1=models.Publisher.objects.annotate(min=Min('books__price')).values('name','min') # 每个书的作者总数进行排序 # a1=models.Book.objects.annotate(count=Count('authors')).order_by('count').values('name','count') # 每个作者写的书的总价格 # a1=models.Author.objects.annotate(sum=Sum('books__price')).values('name','sum')
F和Q查询
F和Q查询 # F查询 #查询销售数量》库存的书 # a1=models.Book.objects.filter(sale_num__gt = F('stock_num')) # F加减乘除:把其中的字段进行更新 # obj=models.Book.objects.all().update(sale_num=F('sale_num')*2+1) # Q查询:因为filter查询是逗号,是and条件的 #查询名字为123或者价格为20的书 obj=models.Book.objects.filter(Q(name='123')|Q(price=50)&Q(pk=1)) print(obj)
事物
事物: from django.db import transaction try: with transaction.atomic(): models.Author.objects.create(name='a') models.Author.objects.create(name='a') models.Author.objects.create(name='a') # int('s') except Exception as e: print(e) # 事物:遇到错误会把之前执行的sql语句删除,回退