1. 程式人生 > 實用技巧 >Django之資料庫--ORM

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="
班級名稱",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"
model

模型裡資料可用欄位型別

欄位型別約束

外來鍵設定

同步模型類的資料到資料庫

    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.py
models.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.py
Views.py

1  HeroInfo.objects.create(
2     hname='沙悟淨',
3     hgender=0,
4     hbook=book)