zoukankan      html  css  js  c++  java
  • DJANGO ORM操作

    单表操作

    增加

    方法一:(推荐使用)

    Teachers.objects.create(name='root')

    方法二:

    obj = Teachers(name='root')
    obj.save()

    #查询Teacher表的所有
    Teachers.objects.all()
    
    #查询Teacher表id=1
    Teachers.objects.filter(id=1)
    
    #查询Teacher表id=1且name=root
    Teachers.objects.filter(id=1,name='root')
    
    #查询Teacher表id大于1的
    result = Teachers.objects.filter(id__gt=1).first()

    删除

    Teachers.objects.filter(id=1).delete()

    #修改所有记录的name为alex
    Teachers.objects.all().update(name='alex')
    
    #修改id=1的记录的name为alex
    Teachers.objects.filter(id=1).update(name='alex')

    一对多操作

    #创建一条记录,外键=1
    Student.objects.create(username='东北',age=18,gender='',cs_id=1)
    
    #创建一条记录,外键=查询后的结果(明显不推荐)
    Student.objects.create(username='东北',age=18,gender='',cs= Classes.objects.filter(id=1).first() )

    #删除id=1的
    Student.objects.filter(id=1).delete()
    
    # 删除外键=1的所有
    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()

    ret = Student.objects.all()
    # []
    # [ obj(..),]
    # [ obj(1      东北       18     男         1),obj(2      东北1      118     男         2),obj(..),]
    for item in ret:
      #本表格内的列
    print(item.id) print(item.username) print(item.age) print(item.gender)
      #本表格的外键
    print(item.cs_id)
      #外键关联表格
    print(item.cs.id) print(item.cs.name)

    查询方式不一样,得到的结果不一样,都是QuerSet

    stu_list = Student.objects.all()
    #相当于SQL语句
    select * from tb;
    #得到的是一个一个对象组成的列表
    [obj,obj,obj,obj]
            
    
    stu_list = Student.objects.all().values("id",'username')
    #相当于SQL语句
    select id,username from tb;
    #得到的是一个一个字典组成的列表
    [{"id":1,'username':'xx'},{id:'',username:''}]   
            
    
    stu_list = Student.objects.all().values_list("id",'username')
    #得到的是一个一个元组组成的列表
    [(1,'root'), (2,'alex')]

    查询三班的所有学生

    #跨表查询,通过foreignkey加双下划线
    Student.objects.filter(cs__name='3班')
    
    obj = Classes.objects.filter(name='3班').first()

    查询所有学生的姓名以及其所在的班级名称

    stu_list = Student.objects.all().values('username',"cs__name")
    #可以针对这个列表进行for循环
    for row in stu_list:
        #对字典进行循环,取出值
        print(row['username'],row['cs__name'])

    查询学生姓名及班级及学校(foreignkey连续跳转)

    stu_list = Student.objects.all().values('username',"cs__titile",“cs__fk__name”)

    针对外键的正向查询,是通过有外键的表格进行查询

    ret = models.Students.objects.filter(cs__title='我们东北')
    
    print(ret)  
    #打印结果:
    #<QuerySet [<Students: Students object (3)>, <Students: Students object (4)>]>

    针对外键的反向查询,是通过外键关联的表格进行查询,表面上表格没有关联字段,实际上有一个隐含的关联字段,名称是有外键的表格的“类名_set”(注意要小写)

    obj = models.Classes.objects.filter(title='我们东北').first()
    
    print(obj.students_set.all())
    #打印结果:(结果与正向查询的结果一致)
    #<QuerySet [<Students: Students object (3)>, <Students: Students object (4)>]>

    设置外键的时候,可以设置related_name='ssss'。此时就在主表中可以使用ssss作为外键使用

    ret = models.Classes.objects.all().values('id','title','ssss')
    print(ret)
    #结果是所有class的数据,并多了students的外键的值
    
    ret = models.Classes.objects.all().values('id','title','ssss__username')
    print(ret)
    #结果是所有class的数据,并多了students表的username的值

    谁是主表?得到的内容不同

    ret = models.Student.objects.all().values('username', 'cs__titile')
    ret1 = models.Classes.objects.all().values('titile', 'ssss__username')
    
    ret: <QuerySet [{'username': '张三', 'cs__title': '全栈1班'}, {'username': '王五', 'cs__title': '我们东北'}, {'username': '333', 'cs__title': '我们东北'}]>
    ret1: <QuerySet [{'title': '全栈1班', 'ssss__username': '张三'}, {'title': '全栈2班', 'ssss__username': None}, {'title': '我们东北', 'ssss__username': '王五'}, {'title': '我们东北', 'ssss__username': '333'}]>
    
    #可以看到,此时谁作为主表进行查询时,将谁全部列出,关联表没有值的时候返回None

    多对多操作

    # 首先筛选出需要增加的班级,形成一个对象
    obj = Classes.objects.filter(id=1).first()     
    #通过操作对象的多对多的属性,一条一条增加
    obj.m.add(2)
    #通过操作对象的多对多的属性,按列表方式增加
    obj.m.add([4,3])
    # 注意插入时必须对应有这个id,否则会报错
    
    # 正向插入
    obj = models.Classes.objects.filter(id=1).first()
    obj.m.add(3)
    
    # 反向插入
    obj = models.Teachers.objects.filter(id=2).first()
    #通过设置   表名_set   的方式,可以进行反向添加
    obj.classes_set.add(5)

    可以在多对多表格设置的时候增加related_name='sssss',这样在反向的时候,就可以使用这个名字

    #moudels.py
    class Classes(models.Model): # 班级表 title = models.CharField(max_length=32) # 建立多对多的表关系。多对多的表关系,放在哪个表都可以,对原表没有影响 m = models.ManyToManyField('Teachers', related_name='sssss')


    #views.py

      obj = models.Teachers.objects.filter(id=2).first()
      obj.sssss.add(5)

     

     

    #通过筛选后的对象,操作多对多的表格,进行删除
    obj.m.remove(2)
    obj.m.remove([4,3])
    
    #通过筛选后的对象,操作多对多的表格,进行清空
    obj.m.clear()

    改(重置)

    #通过筛选后的对象,操作多对多的表格,设置值为2,3,5
    obj.m.set([2,3,5])

    # 查第三张表
    # 把3班的所有老师列举
    obj = Classes.objects.filter(id=1).frist()
    # ret是一个 [ 老师1(id,name),obj(id,name)   ]
    ret = obj.m.all() # 第三张表
  • 相关阅读:
    maven安装
    VMware workstation安装报Microsoft Runtime DLL和Intel VT-x错误
    jQuery的拾色器
    Distributed Representations of Words and Phrases and their Compositionality
    Deep Learning for Natural Language Processeing:vector space models
    Deep Learning for Natural Language Processeing : Convex Optimization
    Java Web的一些基础知识
    Java Web1: 邮件发送系统(JSP+Servlet+JavaBean)
    学习效率与方法
    Deep Learning6: Convolution and pooling
  • 原文地址:https://www.cnblogs.com/trunkslisa/p/9521895.html
Copyright © 2011-2022 走看看