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() # 第三张表
  • 相关阅读:
    176. Second Highest Salary
    175. Combine Two Tables
    172. Factorial Trailing Zeroes
    171. Excel Sheet Column Number
    169. Majority Element
    168. Excel Sheet Column Title
    167. Two Sum II
    160. Intersection of Two Linked Lists
    个人博客记录
    <meta>标签
  • 原文地址:https://www.cnblogs.com/trunkslisa/p/9521895.html
Copyright © 2011-2022 走看看