django_orm 基本操做

单表操做数据库

  1 增的操做:
  2 
  3 一种方式:表名.objects.create(name='xxoo')
  4 
  5 第二种方式:表名(name='xxoo')
  6 
  7 obj=表名(name='xxoo')
  8 
  9 obj.save()
 10 
 11 第一种方式就是第二种方式的内部操做
 12 
 13 
 14 
 15 查的操做:
 16 
 17 获取全部:表名.objects.all()
 18 
 19 条件获取:表名.objects.filter(name='xxoo')   表名.objects.filter(id=1)  表名.objects.filter(id=1,name='xxoo')
 20 
 21 条件是大于1:表名.objects.filter(id__gt=1) 不能使用id>1,是由于传参数不能出现>的表达式,
 22 
 23 只认等于号.
 24 
 25 找到的结果:[obj(id,name),obj(id,name)]
 26 
 27 
 28 
 29 只取第一个:objects.filter(id__gt=1).first()
 30 
 31 找到的结果:[obj(id,name)]
 32 
 33 神奇的双下划线:能够作跨表,也能够做为查找的条件筛选
 34 

 

英文全称:less

  1 -gt:    (greater than) 大于
  2 -ge:    (greater than or equal) 大于或等于
  3 -lt:    (less than) 小于
  4 -le:    (less than or equal)小于或等于
  5 -ne:    (not equal) 不相等
  6 -eq:    (equal) 相等
  7 -nq:    (not equal) 不等于 

 

  1 删的操做:
  2 
  3 表名.objects.filter(id=1).delete()
  4 
  5 表名.objects.all().delete()
  6 
  7 
  8 
  9 改的操做:
 10 
 11 表名.objects.all().update(name='xxoo')
 12 
 13 表名.objects.filter(id=1).update(name='xxoo')
 14 

 

一对多的数据操做spa

Classes班级表code

id     name 对象

1       1班 blog

2        2班 ci

 

Students学生表 rem

id     username   age    gender   cs_id input

1        ago          12        男         1 it

 

 

 

  1 增的操做:
  2 
  3 第一种方式:
  4 
  5 Student.objects.create(username='东北',age=18,gender='男',cs_id=1)
  6 
 10 
 11 第二种方式:
 12 
 13 Student.objects.create(username='东北',age=18,gender='男',cs=Classes.objects.filter(id=1).first())
 14 
 
 15 cs表明的是Classes表拿到的一行数据 拿到的数据:[obj(id,name)]
 16 
 17 
 18 
 19 
 20 
 21 查的操做:
 22 
 23 例:只要是all(),filter()拿到的数据都是多行的数据,保存的时候都要用列表存起来
 24 
 25 能够用来循环
 26 
 27 
 28 
 29 ret=Student.objects.all()
 30 
 31 for item in ret:
 32 
 33 print(item.id)
 34 
 35 print(item.name)
 36 
 37 print(item.age)
 38 
 39 print(item.gender)
 40 
 41 print(item.cs_id)
 42 
 43 在这里print(item.cs_id)找到的是外表的值value
 44 
 45 在这里print(item.cs)找到的是外表的值的集合Queryset
 46 
 47 
 48 
 49 因此能找到加了外键的外表的值:
 50 
 51 print(item.cs.id)
 52 
 53 print(item.cs.name)
 54 
 55 
 56 
 57 删的操做:
 58 
 59 Students.objects.filter(id=1).delete()
 60 
 61 Students.objects.filter(cs_id=1).delete()
 62 
 63 
 64 
 65 例1
 66 
 67 cid=input('输入班级id')
 68 
 69 Students.objects.filter(cs_id=cid).delete()
 70 
 71 例2
 72 
 73 cname=input('输入班级名称')
 74 
 75 错误:Students.objects.filter(cs.name=cname).delete()会报错 cs.name就是等于cs__name
 76 
 77 Students.objects.filter(cs__name=cname).delete() filter跨表操做,须要用双下划线,规定写法
 78 

 

 

多对多的数据操做:

Classes班级表

id     name

1       1班

2        2班

class Classes(models.Model):

    title=models.CharField(max_lenght=32)

    m=models.Model.ManyToManyField('Teachers')第三张表操做

 

Teachers教师表

id     name    

1       ago       

2       ago2     

class Teachers(models.Model):

    name=models.CharField(max_length=32)

 

增的操做:

obj= Classes.objects.filter(id=1).first()   先找到class表id=1的数据

obj.m.add(1) 操做第三张表

obj.m.add(2)

也能够传字典:obj.m.add([3,4])

C_T老师班级表

id     班级id    老师id

1        1           2

1        1           1

1        1           3

1        1           4

 

  1 删的操做:
  2 m=models.Model.ManyToManyField('Teachers')第三张表操做
  3 obj.m.remove([1,2])  只删除老师id=1和2的数据
  4 
  5 obj.m.clear() 清空操做
  6 
  7 
  8 
  9 重置操做:
 10 
 11 obj.m.set([2,3,5]) 把这个班的老师id=4的数据删除,并自增id在最后一行增长一条老师id=5,set的就是最终的结果
 12 
 13 
 14 
 15 查的操做:
 16 
 17 例:把1班老师找出来
 18 
 19 先把班找出来:obj=Classes.objects.filter(id=1).first()
 20 
 21 obj.id
 22 
 23 obj.title
 24 
 25 ret = obj.m.all()目的是拿到老师的信息
 26 
 27 ret是一个[老师obj(id,name),obj2(id,name)]
 28 

 

  1. 类表明一个数据库表
  2. 类的对象代指的是一行记录
  3. 外键字段代指关联表中的一行数据(类的对象)
  4. M2M字段,自动生成第三张表:依赖关联表对第三张表间接操做

 

 

 

需求:拿学生表的全部姓名

for这种方式是把全部的列都取了

stu_list=Students.objects.all()

for row in stu_list:

print(row.id,row.username)

取到的结果是对象的形式[obj,obj,obj,obj]

 

加上values就是取单列数据(字典的形式)

stu_list=Students.objects.all().values('id','username')

取到的结果是字典的形式:[{'id':1,'username':'xxoo'},{'id','username'}]

 

values_list(列表的形式)

stu_list=Students.objects.all().values_list('id','username')

取到的结果是列表的形式:[(1,'xxoo'),('id','username')]

 

需求:

找到1班的全部学生,跨表操做,取到全部数据

stu_list=Students.objects.filter(cs__name='1班')

 

 

找到1班的全部学生的姓名和所在班级,取到单列数据

stu_list=Students.objects.all().values('username',"cs_name") filter能够跨表.values也能够跨表

返回字典的形式,不用row.id,row.username

for row in stu_list:

    print(row['username'],row['cs__name'])

 

 

正向查找与反向查找

假设有三个表,一个学校表,一个班级表,一个学生表

class School(models.Model):

    name=models.CharField(max_length=32)

 

class Classes(models.Model):

    title=models.CharField(max_length=32)

    fk=models.ForeignKey(School)

 

Class Student(models.Model):

   username=models.CharField(max_length=32)

   age=models.InterField()

   gender=models.BooleanField()

   cs=models.ForeignKey(Classes)

 

若是要找到学生所在的班级学校  表里面由foreignkey字段,叫作正向查找

推荐用正向查找

 

stu_list=Students.objects.all().values('username','cs__title','cs__fk__name')

这是由学生表.values去取到班级表跟学校表的内容


 

 

 

若是要由班级表去找到班级所在的学生,若是表里面没有foreignkey字段,叫作反向查找

通常不会进行此操做

Class Student(models.Model):

   username=models.CharField(max_length=32)

   age=models.InterField()

   gender=models.BooleanField()

   cs=models.ForeignKey(Classes,related_name='s')

  也能够设定related_name='s'替代students_set,

要去关联的话,可以使用隐藏的字段,[表名(类名)]的首个字母小写加上_set:

obj.student_set

obj=models.Classes.objects.filter(title='1班').first()

obj.students_set.all().username,age,gender,cs

obj.s.all()

 

谁是主表?

models.Students.objects.all().values('usernma','cs__title')

models.Classes.objects.all().values('title','s__username')

相关文章
相关标签/搜索