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() # 第三张表

 

posted @ 2018-08-23 09:37  Trunkslisa  阅读(178)  评论(0编辑  收藏  举报