Djiango 連線資料庫mysql 的基本資料操作
阿新 • • 發佈:2021-07-15
1、單表操作
(1).增加操作
1 # 增加操作 2 def add_person(request): 3 # 1.使用save() 方法 4 # person_obj = models.Person() 5 # person_obj.name = 'wanwu' 6 # person_obj.age = 18 7 # person_obj.gender = False 8 # person_obj.address = 'shanghai' 9 # person_obj.save() 10 # 2.使用create() 方法11 # person_obj = models.Person.objects.create(name='lsi', age=20, gender=True, address='shenzhen') 12 # print(person_obj.id) 13 14 models.Goods.objects.create(name='蘋果', xl=1000, kc=2000) 15 models.Goods.objects.create(name='香蕉', xl=1000, kc=500) 16 models.Goods.objects.create(name='梨', xl=1000, kc=700)
(2).查詢操作
1 def find_person(request): 2 # 1.get() 返回值是一個具體物件。如果不存在則報錯!!!,返回多了也報錯 3 # person_obj = models.Person.objects.get(id=2) 4 # print(person_obj) 5 6 # 2.first() 和last()方法 返回值是一個具體的物件。 7 # ret = models.Person.objects.last() 8 # print(ret) 9 # 3.all() 返回一個QuerySet物件,類似於列表。10 # person_obj_list = models.Person.objects.all() 11 # print(person_obj_list) 12 # # <QuerySet [<Person: Person object (1)>, <Person: Person object (2)>, <Person: Person object (3)>]> 13 # for person_obj in person_obj_list: 14 # print(person_obj.name) 15 # 4.filter() 16 # person_obj_list = models.Person.objects.filter(age=18) 17 # print(person_obj_list) # <QuerySet [<Person: Person object (1)>, <Person: Person object (3)>]> 18 # 多個條件之間使用並且的關係。 19 # ret = models.Person.objects.filter(age=18, name='zss') 20 # print(ret) 21 # 5.排序order_by() -id 表示降序。 22 # ret = models.Person.objects.all().order_by('-id') 23 # print(ret) 24 25 # 6.雙下劃線查詢 26 # ret = models.Person.objects.filter(age__gte=18) 27 # print(ret) 28 # ret = models.Person.objects.filter(name__startswith='z') 29 # print(ret) 30 31 # 7.聚合函式aggregate() 32 from django.db.models import Count, Max, Min, Sum, Avg, F, Q 33 # 求年齡的平均值 34 # ret = models.Person.objects.all().aggregate(Avg('age')) 35 # print(ret) # {'age__avg': 18.6667} 36 37 # 8.分組 annotate() 38 # 按性別來分組,求人數 39 # ret = models.Person.objects.all().values('gender').annotate(Count('gender')) 40 # print(ret) 41 # 9. F和Q查詢 42 # F 查詢:同一個模型類中,不同屬性進行比較。 43 # 查詢銷量(xl)大於庫存(kc)的商品 44 # ret = models.Goods.objects.filter(xl__gt=F('kc')) 45 # print(ret) 46 # Q查詢:可以實現複雜的查詢 not (~)、and (&)、or (|) 關係的使用。 47 # 查詢庫存大於1000 、或者銷量等1000的商品 48 # ret = models.Goods.objects.filter(Q(xl=1000) | Q(kc__gt=1000)) 49 # print(ret) 50 # ret = models.Goods.objects.all()[2] # 索引 51 # print(ret) 52 # ret = models.Goods.objects.all()[1:] # 切片 53 # print(ret) 54 return HttpResponse('find person...')
(3).修改操作
1 def update_person(request): 2 # 1.使用save() 3 # person_obj = models.Person.objects.get(id=2) 4 # person_obj.age = 23 5 # person_obj.save() 6 # 2. 使用update()方法,查詢出多個來統一修改 7 ret = models.Person.objects.filter(name='lsi').update(age=22) 8 print(ret) 9 10 return HttpResponse('update person...')
(4).刪除操作
# 刪除操作 def delete_person(request): person_obj = models.Person.objects.get(id=1) person_obj.delete() return HttpResponse('delete person...')
2、一對一操作
(1).模型類
1 class User(models.Model): 2 id = models.AutoField(primary_key=True) 3 name = models.CharField(max_length=32) 4 age = models.IntegerField(default=10) 5 6 7 class IdCard(models.Model): 8 id = models.AutoField(primary_key=True) 9 address = models.TextField(default='beijing') 10 cardnum = models.CharField(max_length=32) # 身份證號 11 # 一對一關聯 12 # to=User :關聯的表。on_delete:刪除策略。 13 # models.CASCADE:級聯刪除,刪除一的一方的時候,另外一方也刪除。 14 # related_name='card':表示反向查詢的時候使用屬性。如果不寫,反向查詢的時候預設值為類名小寫idcard 15 user = models.OneToOneField(to=User, on_delete=models.CASCADE, related_name='card') # 在資料庫中會自動新增_id 16 17 18 19 20 21 22 23 def one_add(request): 24 # user_obj = models.User() 25 # user_obj.name = 'zs' 26 # user_obj.age = 18 27 # user_obj.save() 28 # idcard_obj = models.IdCard() 29 # idcard_obj.cardnum = '131126333' 30 # idcard_obj.address = 'beijing' 31 # idcard_obj.user = user_obj # 設定關係--> 賦值物件 32 # idcard_obj.save() 33 34 user_obj = models.User() 35 user_obj.name = 'lsi' 36 user_obj.age = 20 37 user_obj.save() 38 39 idcard_obj = models.IdCard() 40 idcard_obj.cardnum = '131126444' 41 idcard_obj.address = 'shangai' 42 idcard_obj.user_id = user_obj.id # 設定關係--> 賦值id 43 idcard_obj.save() 44 45 return HttpResponse('one add...') 46 47 48 # 查詢 49 50 def one_find(request): 51 # 正向查詢 52 # 1.查詢id 為1 的身份證對應的人。 53 # card_obj = models.IdCard.objects.get(id=1) 54 # user_obj = card_obj.user # 通過關係屬性獲取物件 55 # print(user_obj, user_obj.name) # User object (1) 56 57 # 反向查詢 58 # 2.查詢zs 對應的身份證物件 59 user_obj = models.User.objects.filter(name='zs').first() 60 # card_obj = user_obj.idcard # 類名小寫,直接獲取到物件。 61 card_obj = user_obj.card # 使用的related_name屬性的值。 62 print(card_obj) 63 return HttpResponse('one find...') 64 65 66 def one_delete(request): 67 # 刪除zs 68 user_obj = models.User.objects.get(id=1) 69 user_obj.delete() # 級聯刪除身份證 70 return HttpResponse('one delete...')
3、一對多操作
1 # 部門表 2 class Dept(models.Model): 3 id = models.AutoField(primary_key=True) 4 name = models.CharField(max_length=32) 5 6 7 class Employee(models.Model): 8 id = models.AutoField(primary_key=True) 9 name = models.CharField(max_length=32) 10 # 設定外來鍵 11 dpet = models.ForeignKey(to=Dept, on_delete=models.CASCADE, related_name='emps') 12 13 14 15 16 17 # 一對多操作 18 19 def onetomany_add(request): 20 dept_obj = models.Dept.objects.create(name='市場部') 21 emp_obj = models.Employee() 22 emp_obj.name = 'lsi' 23 emp_obj.dpet = dept_obj # 賦值物件即可 24 emp_obj.save() 25 26 emp_obj1 = models.Employee() 27 emp_obj1.name = 'ww' 28 emp_obj1.dpet = dept_obj 29 emp_obj1.save() 30 31 emp_obj2 = models.Employee() 32 emp_obj2.name = 'zl' 33 emp_obj2.dpet = dept_obj 34 emp_obj2.save() 35 36 return HttpResponse('onetomany_add...') 37 38 39 # 查詢 40 41 def onetomany_find(request): 42 # 正向查詢 43 # 1.查詢lsi 對應的部門 44 # emp_obj = models.Employee.objects.filter(name='lsi').first() 45 # print(emp_obj.dpet) # 獲取部門物件 46 47 # 反向查詢 48 # 2.查詢市場部對應的所有員工 49 dept_obj = models.Dept.objects.get(name='市場部') 50 # ret = dept_obj.employee_set.all() # 使用類名小寫_set.方法() 51 ret = dept_obj.emps.all() # 設定查詢名稱 52 print(ret) 53 54 return HttpResponse('onetomany_find...') 55 56 57 # 刪除 58 def onetomany_delete(request): 59 # 1.刪除lsi 60 # emp_obj = models.Employee.objects.filter(name='lsi').first() 61 # emp_obj.delete() 62 63 # 2.刪除市場部,會級聯刪除對應的員工。 64 dept_obj = models.Dept.objects.get(name='市場部') 65 dept_obj.delete() 66 67 return HttpResponse('onetomany_delete...')
4、多對多操作
1 class Teacher(models.Model): 2 id = models.AutoField(primary_key=True) 3 name = models.CharField(max_length=32) 4 salary = models.IntegerField(default=1000) 5 6 7 class Student(models.Model): 8 id = models.AutoField(primary_key=True) 9 name = models.CharField(max_length=32) 10 age = models.IntegerField(default=20) 11 # 多對多關係 12 teachers = models.ManyToManyField(to=Teacher) 13 14 15 16 17 18 def many_add(request): 19 std_obj1 = models.Student() 20 std_obj1.name = 'zs' 21 std_obj1.age = 10 22 std_obj1.save() 23 std_obj2 = models.Student() 24 std_obj2.name = 'sli' 25 std_obj2.save() 26 27 tea_obj = models.Teacher() 28 tea_obj.name = 'laowang' 29 tea_obj.save() 30 31 tea_obj1 = models.Teacher() 32 tea_obj1.name = 'laoli' 33 tea_obj1.save() 34 # 設定關係 35 std_obj1.teachers.add(tea_obj, tea_obj1) 36 std_obj2.teachers.add(tea_obj, tea_obj1) 37 38 return HttpResponse('many to many add...') 39 40 41 def many_find(request): 42 # 1.zs 被哪些老師教過 43 # std_obj = models.Student.objects.get(name='zs') 44 # ret = std_obj.teachers.all() 45 # print(ret) 46 47 # 2.laowang 教過哪些學生 48 tea_obj = models.Teacher.objects.get(name='laowang') 49 ret = tea_obj.student_set.all() # 類名小寫_set.方法名稱() 50 print(ret) 51 return HttpResponse('many to many find...')