• Django之ORM操作总结


    Django之ORM总结

    表结构

    from django.db import models
    
    
    # 一对多:班级与学生
    # 多对多:班级与老师
    
    # Create your models here.
    #创建班级表
    class Classes(models.Model):
        title = models.CharField(max_length=32)
        n=models.ManyToManyField('Teachers',related_name="sssss")
    
    
    #创建老师表
    class Teachers(models.Model):
        name= models.CharField(max_length=32)
        age=models.IntegerField(default=30)
        gender=models.BooleanField(default=False)
        is_married=models.BooleanField(default=True)
        address = models.CharField(max_length=50,default='xiaogan')
    # #创建第三张关系表
    # class C2T(models.Model):
    #     cid = models.ForeignKey(Classes)
    #     tid = models.ForeignKey(Teachers)
    
    #创建学生表
    class Student(models.Model):
        username=models.CharField(max_length=32)
        age=models.IntegerField()
        #只能写true和false
        gender=models.BooleanField()
        cs=models.ForeignKey(Classes,on_delete=models.DO_NOTHING)
        address=models.CharField(max_length=50,default='xiaogan')
    

      

    单表操作

    增加数据的两种方式:
    
    第一种:
    Teachers.objects.create(name="root")
    
    第二种:
    obj=Teachers(name="root")
    obj.save()
    

      

    删除id为1的表记录
    Teachers.objects.filter(id=1).delete()
    

      

    修改所有数据的姓名为alex
    Teachers.objects.all().update(name="alex")
    
    修改id为1的name为alex
    Teachers.objects.filter(id=1).update(name="alex")
    

      

    获取所有的数据
    Teachers.objects.all()
    
    获取第一行数据
    Teachers.objects.all().first()
    
    获取倒数第一行的数据
    Teachers.objects.all().last()
    
    获取id=1的表记录
    Teachers.objects.filter(id=1)
    
    获取id=2并且name="root"的表记录
    Teachers=.objects.filter(id=2,name="root")
    

      

    一对多操作

    班级 
    id  title
    1    2班
    2    3班
    
    学生
    id  username  age  gender   cs_id
    1    小明      20   True     1
    

      

    查看(all()、filter()、values()等)
    ret = Student.objects.all()
    
    for item in ret:
    	print(item.id)
    	print(item.username)
    	print(item.age)
    	print(item.gender)
    	print(item.cs_id)
    #这里的cs为对象,
    	print(item.cs.id)
    	print(item.cs.name)
    
    注意:cs_id为字段名,cs为对象。
    

      

    删除:
    
    删除Student表中id为1的记录
    Student.objects.filter(id=1).delete()
    
    删除cs_id为1的记录,这里为整个三班的学生
    Student.objects.filter(cs_id=1).delete()
    或者
    Student.objects.filter(cs__name="3班").delete()
    
    注意:这里在filter里面进行跨表操作不是cs.name,而是cs__name。
    

      

    多对多操作

    首先我们要明白:
    建立多对多关系可以两张表的随便哪张表都行。
    默认在表里是不显示这个字段的。
    建立多对多关系默认会创建第三张表,不需要手动创建。
    对第三张表的操作还是通过建立多对多关系的对象来操作。
    

      

    班级:
    id  title
    1    2班
    2    3班
    3    1班
    
    老师:
    id name  age gender  is_married 
    1  alex  35   True   True
    2  Tom   43   Ture   True
    3  小明   26  True    False
    
    
    
    老师关系表:
    id  班级id   老师id
    1     2        1
    2     1        1
    3     1        2
    4     3        3
    

      

    增加:
    obj =Classes.objects.filter(id=1).first()  
    obj.n.add(3)
    
    
    obj:获取的是2班这个对象
    obj.n.add(3):就第三张表中加入一条数据,将班级id为1的班级与老师id为3的老师关联起来,
    obj.n.add([4,5]):现在将id为4和5的两位老师关联这个班级
    
    删除:
    obj.n.remove(3):解除id为1的班级与id为3的老师的记录
    
    obj.n.remove([4,5]):解除id为1的班级与id为4,5的老师的记录
    

      

    清空:
    obj.n.clean():解除id为1的班级和所有关联老师的记录
    

      

    重置:
    obj.n.set([2,3,5]):先解除所有与obj对象关联的对象,然后重新设置关联
    

      

    #把三班的所有老师列举出来:
    obj =Classes.objects.filter(id=2).first()  [id,title]
    ret=obj.n.all()
    
    ret是一个对象集合,获取另一个表的与id为2的班级关联老师的所有对象
    [老师1(id,name...),老师2(id,name...),...]
    
    注意:我们想要获取的不是第三张表(关系表)的数据,想要获取的是关联表的数据。
    

      

     正向操作

    获取每个班级的对象(id,班级名字,任课老师)
    v =models.Classes.object.all().values('id','title','n__name')
    
    获取每个班级对象
    cls_list=models.Classes.objects.all()
    
    for obj in cls_list:
    	#每个班级id和名字
    	print(obj.id,obj.title)
    	#每个班级的所有任课老师
    	for row in obj.n.all():
    	print(row.name)
    

      

    反向操作

    获取id为2的老师对象
    obj=models.Teachers.objects.filter(id=2).first()
    
    给老师分配一个班级
    obj_set.add(2)
    
    另外一种方法:
    releated_name="sssss"
    obj.sssss.add(2)
    
    注意:
    给老师只分配1,2班级,如果有别的关系则删除,如果存在关系则保留,没有关系则创建。
    obj.sssss.set([1,2])
    
    通过第三张表查询关联表的内容
    v =models.Teachers.object.all().values('name','sssss_title')
    

      

    示例:所有学生的姓名以及所在班级名称

    stu_list =Student.objects.all() #select * from table;
    	for student in stu_list:
    		student.name
    		student.cs.title
    
    [obj,obj,obj,...]
    

      

    stu_list =Student.objects.all().value("name","cs__title")
    

      

    stu_list =Student.objects.all().value_list("name","cs__title")
    	for student in stu_list:
    		student['name']
    		student['cs__title']
    [("name":零,"title":3班),("name":零,"":)]
    
    找到三班的所有学生:
    Student.objects.filter(cs__name="3班")
    

      

    总结:
    ORM通过类来操作数据库表。
    
    一个类对应一张数据库的表。
    
    通过类实例化出来的对象表达表中的一条记录。
    
    类的属性为表中的字段。
    
    其中外键代表关联表中的一行记录(对象)。
    
    外键是一个对象,通过这个对象就可以调用关联表的字段。
    
    注意:filter(),all(),get()等获取的都是一个对象集合,
    {对象1{属性1,属性2},对象2{属性1,属性2}....}
    
    对象调用本表内的字段:
    对象.本表字段
    
    对象调用外表的字段:
    外键名.外表字段
    
    而在filter,get,all,values()中使用
    外键名__外表字段 
    
    

      

  • 相关阅读:
    [BZOJ3413]匹配
    [BZOJ3879]SvT
    [BZOJ1339] [Baltic2008] Mafia / 黑手党
    [BZOJ1834] [ZJOI2010] network 网络扩容
    [BZOJ1449] [JSOI2009]球队收益 / [BZOJ2895] 球队预算
    [BZOJ2597] [WC2007]剪刀石头布
    [BZOJ1283]序列
    [BZOJ2127]happiness
    Java公开课-04.异常
    Java公开课-03.内部类
  • 原文地址:https://www.cnblogs.com/-wenli/p/10439447.html
Copyright © 2020-2023  润新知