Django之資料庫--ORM
一、建立資料庫模型類
1.在model裡建立模型類。(繼承models.Model)
from django.db import models # Create your models here. class Role(models.Model): role_name = models.CharField(max_length=32, unique=True) class Meta: db_table = "pp_role" class Classroom(models.Model): class_name = models.CharField(max_length=32,verbose_name="model班級名稱",unique=True) address = models.CharField(max_length=32,null=True) class Meta: db_table = "pp_class" class User(models.Model): username = models.CharField(max_length=32,verbose_name="姓名") age =models.IntegerField(verbose_name="年齡") home = models.CharField(verbose_name="家鄉",null=True,max_length=32) hight = models.IntegerField(verbose_name="身高",null=True) #多對多 roles = models.ManyToManyField(Role) #一對多 classrooms = models.ForeignKey(Classroom,on_delete=models.CASCADE,null=True) class Meta: db_table="pp_user"
模型裡資料可用欄位型別
欄位型別約束
外來鍵設定
同步模型類的資料到資料庫
python manage.py makemigration
python manage.py migrate
二、資料的增加
在views中新增
def post(self,request): data=request.data ser=UserSer1(data=data) ser.is_valid() print(ser.errors) ser.save() return Response({"code":200})View
三、資料的刪除
在views中新增
def delete(self,request): user_id = request.query_params.get('user_id') print(user_id,1111111111111) user_obj = User.objects.filter(pk=user_id) user_obj.delete() return Response({'msg':'sccg'})View
四、資料的修改
在views中新增
def put(self,request): data=request.data id=request.data.get("id") user=User.objects.get(id=id) Ser=UserSer1(user,data=data) Ser.is_valid() Ser.save() return Response({"code":200})Views.py
五、資料庫的查詢
1.基本查詢:
user= User.objects.get(btitle='張三') #單一查詢,如果結果不存在報錯
user= User.objects.all(btitle='張三') #查詢多個結果,有多少返回多少,不存在返回None
user= User.objects.count(btitle='張三' ) #查詢結果的數量
user= User.objects.exclude(btitle='張三') #查詢結果取反
2.模糊查詢:
a.contains 是否包含
user= User.objects.filter(btitle__contains='市') #查詢結果包含‘市’的
b.startswith,endswith 以指定值開頭或結尾
user= User.objects.filter(btitle__startswith='北') #查詢以‘北’開頭的
user= User.objects.filter(btitle__endswith='市') #查詢以‘市’結尾的
3.空查詢:
isnull 是否為空
user= User.object.filter(bititle__isnull=Flase) #查詢bititle不為空
4.範圍查詢:
in 在範圍內
range 相當於between...and...
book = BookInfo.object.filter(id__in = [1,5,13,24]) #查詢id為1或5或13或24
book = BookInfo.object.filter(id__range = [10,20]) #查詢範圍為10-20的id
5.比較查詢:
gt 大於
gte 大於等於
lt 小於
lte 小於等於
exclude 不等於
book = BookInfo.object.filter(id__gt =10) #查詢id大於10的
book = BookInfo.object.exclude(id = 10) #查詢id不等於的10的
6.日期查詢
year、month、day、week_day、hour、minute、second:對日期時間型別的屬性進行運算。
book = BookInfo.object.filter(bpub_date__year = 1977) #查詢1977年出版的書
book = BookInfo.object.filter(bpub_date__gt =date(1977,1,1)) #查詢1977年1月1日以後出版的書
7.F物件和Q物件
比較兩個欄位物件之間的關係用F物件。(F物件可以進行運算)
book = BookInfio.Object.filter(bread__gte=F('bcomment')) #查詢閱讀量等於評論量的物件
book = BookInfio.Object.filter(bread__gte=F('bcomment') * 2 )
與邏輯運算子連用使用Q物件。 或( | ) 與( & ) 非( ~ )
book = BookInfo.Object.filter(Q(bread__gte=20) | Q(pk__lt=3)) #查詢閱讀量為20或者id為3的物件
8.聚合函式
使用aggregate()過濾器呼叫聚合函式。聚合函式包括:Avg平均,Count數量,Max最大,Min最小,Sum求和
book = BookInfo.Object.aggregate(Sum('bread')) #求閱讀量的和
9.排序
使用order_by對結果進行排序
book=BookInfo.object.all().order_by('bread') #按閱讀量的升序排列
book=BookInfo.object.all().order_by('-bread') #按閱讀量的降序排列
10.關聯查詢
一對多模型
一到多的訪問語法:一對應的模型類物件.多對應的模型類名小寫_set
b = BookInfo.object.filter(id = 1)
b.heroinfo_set.all() #查詢book_id = 1的書裡的所有英雄
(一本書裡有多個英雄,一個英雄只能存在一本書裡。表關係為一對多,英雄表裡外來鍵關聯書id,英雄表裡的存放多個書id。英雄表為多,書表為一。)
多到一的訪問語法:多對應的模型類物件.多對應的模型類中的關係類屬性名
h = HeroInfo.object.filter(id = 1)
h.hbook #查詢英雄id = 1的書是哪本。
方向查詢除了可以使用模型類名_set,還有一種是在建立模型類的時候使用related_name來指定變數名。
hbook= model.ForeignKey(HeroInfo,on_delete=model.CACADE,null=Ture,related_name='heros')
b.herose.all()
六、多對多表操作
1、建多對多表
在modle中新增
class Student(models.Model): name = models.CharField(max_length=32) # 老師類 class Teacher(models.Model): name = models.CharField(max_length=32) stu = models.ManyToManyField(to='Student',related_name='teacher') #讓django幫助建立多對多關係表 model.pymodels.py
在views中新增
class ManyToManyTest(APIView): def get(self, request): # 方法一:在建立manytomany的models裡查資料 # teacherobj = models.Teacher.objects.get(id=2) # data = teacherobj.stu.all() # data_list = [] # for i in data: # data_dic={ # "student_name":i.name, # "teacher_name":teacherobj.name # } # data_list.append(data_dic) # return Response(data_list) # 方法二:在未建立manytomany的models裡查資料 studentobj = models.Student.objects.get(id=2) data = studentobj.teacher_set.all() data_list = [] for i in data: data_dic = { "student_name": studentobj.name, "teacher_name": i.name } data_list.append(data_dic) return Response(data_list) def post(self, request): # 方法一:在建立manytomany的models裡新增資料,(一條,一個物件) # teacherobj = models.Teacher.objects.filter(id=1).first() # studentobj = models.Student.objects.filter(id=2).first() # teacherobj.stu.add(studentobj) # return Response({ # "status": 200 # }) #方法二:在未建立manytomany的models裡新增資料,(一條,一個物件) teacherobj = models.Teacher.objects.all() studentobj = models.Student.objects.filter(id=2).first() studentobj.teacher_set.set(teacherobj) return Response({ "status": 200 }) def put(self, request): # 方法一:在建立manytomany的models裡修改資料,引數只能是可迭代物件 teacherobj = models.Teacher.objects.filter(id=3).first() studentobj = models.Student.objects.filter(id=2) teacherobj.stu.set(studentobj) return Response({ "status": 200 }) #方法二:在未建立manytomany的models裡修改資料,引數只能是可迭代物件 # teacherobj = models.Teacher.objects.all() # studentobj = models.Student.objects.filter(id=2).first() # studentobj.teacher_set.set(teacherobj) # return Response({ # "status": 200 # }) def delete(self, request): # 方法一:在建立manytomany的models裡刪除資料,(一條,一個物件) # teacherobj = models.Teacher.objects.filter(id=1).first() # studentobj = models.Student.objects.filter(id=2).first() # teacherobj.stu.remove(studentobj) # return Response({ # "status": 200 # }) #方法二:在未建立manytomany的models裡刪除資料,(多條,可迭代物件) teacherobj = models.Teacher.objects.all() studentobj = models.Student.objects.filter(id=2).first() studentobj.teacher_set.remove(*teacherobj) return Response({ "status": 200 }) views.pyViews.py
1 HeroInfo.objects.create( 2 hname='沙悟淨', 3 hgender=0, 4 hbook=book)