Django:ORM补充

from django.db import models

# Create your models here.
from django.db import models

# Create your models here.

class Teachers(models.Model):
    '''
    教师表
    '''
    name=models.CharField(max_length=32)


''' 单表的增删改查: 增 Teachers.objects.create(name='root') obj = Teachers(name='root') obj.save() 查 Teachers.objects.all() Teachers.objects.filter(id=1) Teachers.objects.filter(id__gt=1) Teachers.objects.filter(id=1,name='root') 删 Teachers.objects.filter(id=1).delete() 改 Teachers.objects.all().update(name='alex') '''

class Student(models.Model): ''' 学生表 ''' username = models.CharField(max_length=32) age = models.IntegerField() gender = models.BooleanField() cs = models.ForeignKey(Classes,on_delete=models.CASCADE)

''' 一对多的增删改查: 增: Student.objects.create(username='alex',age=18,gender='man',cs_id=1) Student.objects.create(username='alex',age=18,gender='man',cs=Classes.object.filter(id=1).first()) 查: ret = Student.object.all() for i in ret: print(i.id) print(i.username) print(i.age) print(i.gender) print(i.cs_id) print(i.cs.id) print(i.cs.name) 删: Student.objects.filter(id=1).delete() Student.objects.filter(cs_id=1).delete() cid = input('请输入要删除的班级id') Student.objects.filter(cs_id=cid).delete() 跨表删除 cname = input('请输入要删除的班级名称') Student.objects.filter(cs__name=cname).delete() 改: Student.objects.all().update(cs_id=1) '''
class Classes(models.Model): ''' 班级表 ''' title = models.CharField(max_length=32) m = models.ManyToManyField('Teachers')


''' 班级表: id title 1 1班 2 2班 3 3班 教师表: id name 1 Alex 2 老妖 3 瞎驴 4 Eric 5 Eric 多对多的表操作 ManyToMany models中没有第三张表,不能直接create操作 只能通过字段m进行操作 #增 obj1 = Classes.objects.filter(id=1).first() obj1.m.add(2) obj1.m.add(3) obj1.m.add([4,5]) obj2 = Classes.objects.filter(id=2).first() obj2.m.add(2) obj2.m.add(3) obj2.m.add([4,5]) 班级_教师表: id 班级id 教师id 1 1 2 2 1 3 3 1 4 4 1 5 5 2 2 6 2 3 7 2 4 8 2 5 #删除与清空 obj1.m.remove(2) obj2.m.clear() 班级_教师表: id 班级id 教师id 2 1 3 3 1 4 4 1 5 #改---->重置 obj1.m.set([2,3,4]) 班级_教师表: id 班级id 教师id 2 1 3 3 1 4 9 1 2 查: 查询一班的所有老师姓名 obj = Classes.objects.filter(id=1).first() ret = obj.m.all()#ret是一个教师列表[老师obj1(id,name),老师obj2(id,name)...] '''

 

all     values  values_list  的区别:

#显示所有学生的id 姓名以及所在班级名称
'''
方式一:all() 对象集合
stu_list = Student.objects.all()
[obj,obj,obj,...]                               #stu_list是对象集合

select * from tb;

for stu in stu_list:
    print(stu.id,stu.username,stu.cs.title)


方式二:values() 字典集合
stu_list = Student.objects.all().values('id','username','cs__title')
[{id:1,username:"xx",title:"1班"},{id:2,username:"yy",title:"2班"},...]  #stu_list是字典集合
for stu in stu_list:
    print(stu['id'],stu['username'],stu['cs__title'])


#方式三:values_list() 元组集合
stu_list = Student.objects.all().values_list('id','username','cs__title')
[(1,"root","1班"),(2,"alex","2班"),...]                     #stu_list是元组集合

for stu in stu_list:
    print(stu.0,stu.1,stu.2)
'''

# class School(models.Model):
#     '''
#     校区表
#     '''
#     name=models.CharField(max_length=32)

#找到3班的所有学生(跨一张表)
#Student.objects.filter(cs__title='3班')

#学生表-->班级表-->校区表
#假设班级表有外键fk连接校区表(id,name)
#stu_list = Student.objects.all().values('id','username','cs__title','cs__fk__name')

 

一对多的正反向查询:

正向查询(推荐):

def test(request):
    #正向查询
    obj = models.Student.objects.filter(cs__title='1班')
    print(obj)

    return HttpResponse("test")

 反向查询(默认)

def test(request):
    #反向查询(默认):(小写)类名_set    注意:obj.student_set仅关联到子表,并没有查询,必须使用all()方法
    obj = models.Classes.objects.filter(title='1班').first()
    print(obj.student_set)              #app01.Student.None
    print(obj.student_set.all())        #<QuerySet [<Student: Student object (1)>, <Student: Student object (2)>]>
    return HttpResponse("test")

反向查询(自定义)

*********************models*********************
class Student(models.Model):
    '''
    学生表
    '''
    username = models.CharField(max_length=32)
    age = models.IntegerField()
    gender = models.BooleanField()
    cs = models.ForeignKey(Classes,on_delete=models.CASCADE,related_name='ssss')

*********************views*********************
def test(request)
  #反向查询:ssss    注意:obj.ssss仅关联到子表,并没有查询,必须使用all()方法
    obj = models.Classes.objects.filter(title='1班').first()
    print(obj.ssss)              #app01.Student.None
    print(obj.ssss.all())        #<QuerySet [<Student: Student object (1)>, <Student: Student object (2)>]>
    return HttpResponse("test") 

 实例:

def test(request):
# #反向查询:自定义
    # ret = models.Classes.objects.all().values('id','title','ssss')
    # print(ret)          #1班两个学生,2班两个学生,3班无学生
    # #<QuerySet [{'id': 1, 'title': '1班', 'ssss': 1}, {'id': 1, 'title': '1班', 'ssss': 2}, {'id': 2, 'title': '2班', 'ssss': 3}, {'id': 2, 'title': '2班', 'ssss': 4}, {'id': 3, 'title': '3班', 'ssss': None}]>

    
    ret1 = models.Student.objects.all().values('username','cs__title')      #left join
    ret2 = models.Classes.objects.all().values('title','ssss__username')    #left join

   #left join:主表的所有记录都显示
print(ret1)#<QuerySet [{'username': '小东北', 'cs__title': '1班'}, {'username': '中东北', 'cs__title': '1班'}, {'username': '大东北', 'cs__title': '2班'}, {'username': '老东北', 'cs__title': '2班'}]> print(ret2)#<QuerySet [{'title': '1班', 'ssss__username': '小东北'}, {'title': '1班', 'ssss__username': '中东北'}, {'title': '2班', 'ssss__username': '大东北'}, {'title': '2班', 'ssss__username': '老东北'}, {'title': '3班', 'ssss__username': None}]> return HttpResponse("test")

 

多对多的增删改查以及正反向查询:

def test(request):
#多对多操作

    #增:

    #添加教师记录
    # models.Teachers.objects.create(name='alex')
    # models.Teachers.objects.create(name='xialv')
    # models.Teachers.objects.create(name='SB')
    # models.Teachers.objects.create(name='wupeiqi')

    # #给id=1的班级分配教师(正向)
    # obj = models.Classes.objects.filter(id=1).first()
    # obj.m.add(1)
    # obj.m.add(2)
    # obj.m.add(3)

    # #给id=2的教师安排班级(反向)
    # obj = models.Teachers.objects.filter(id=2).first()
    # # obj.classes_set.add(3)
    # obj.sssss.add(2)

    #查:

    # #获取所有班级记录
    # cls_list = models.Classes.objects.all()
    # #循环输出所有班级信息以及该班级的所有任课教师
    # for cls in cls_list:
    #     print(cls.id,cls.title)
    #     for row in cls.m.all():
    #         print('------',row.name)



    #改:
    #set重置,有重复的不动
    obj = models.Teachers.objects.filter(id=2).first()
    ''' 
    id      classes_id      teacher_id
    1           1               2
    2           2               2
    3           3               2
    '''

    obj.sssss.set([1,2,4])
    '''
    id      classes_id      teacher_id
    1           1               2
    2           2               2    
    4           4               2
    '''

    #删:
    obj.sssss.remove(1)
    '''
    id      classes_id      teacher_id
    2           2               2    
    4           4               2        
    '''


    return HttpResponse("test")

 

字典与元组对象无法通过.add()等方法进行增删改查

filter() all()得到的是对象,内部的外键可以使用add() remove()等方法进行增删改查

obj = models.Classes.objects.filter(id=1).first()
obj.m.add(1)

values() values_list得到的是字典或元组对象,内部的外键是int类型,无法使用add()等方法

v = models.Classes.objects.all().values('id','title','m','m__name')
    print(v)

v = models.Teachers.objects.all().values('id','name','sssss__title')
    print(v)

 

posted @ 2020-10-07 23:30  麟灬  阅读(83)  评论(0)    收藏  举报