设为首页 加入收藏

TOP

Django之ORM(二)
2018-11-14 18:12:15 】 浏览:235
Tags:Django ORM
tudent.objects.get(id=1)
student1.teacher.add(teacher1,teacher2)

```

```python

teacher1=teacher.objects.filter(id__gt=1,id__lt=10)
student1=student.objects.get(id=1)
student1.teacher.add(*teacher1)

```

```python

teacher1=teacher.objects.filter(id=1)[0]
student1=student.objects.filter(id__gt=1)
teacher1.student_set.add(*student1)

```

```python

student1=student.objects.filter(id=1)[0]
student1.teacher.add(2)

```

如果多对多关系的表是自己手动创建的,那么还可以直接添加该表的字段,利用两个外键的方式添加。

###2.删除

######1.删除普通表信息

先找到,再删除

```python

student1=student.objects.filter(id=1)[0].delete()

```

由于django的级联删除,其他表中如student_teacher表中有student1的信息的数据也会删除

######2.删除多对多表的信息

```python

student1=student.objects.filter(id=1)[0]
student1.teacher.clear()#删除多对多表中student_id为student1的id的数据
student1.teacher.remove(2)#删除多对多表中teacher_id为2的数据
student1.teacher.remove(*list)#这里也可以为一个列表

```

反向即使用student_set,其他和正向同样道理

###3.修改

######1.普通字段的修改

```python

student1=student.objects.get(id=2)
student1.name="sfencs"
student1.save()

``

或者

```python

student1=student.objects.filter(id=2).update(name="sfencs")

```

update是queryset的方法,可以更新多行数据。

save方法是将一行的所有字段都重新存储一遍,update方法只将要改变的字段存储,效率更高。

######2.多对多表的字段的修改

先删除,再添加

###4.查询

######1.查询的有关函数

* filter(**kwargs)筛选

* all()所有结果

* get(**kwargs)得到一个结果,如果结果多于一个或没有都会报错

 

如果查询结果是一个结果集,即QuerySet对象,那么它还有以下方法

* values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列
* exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
* order_by(*field): 对查询结果排序
* reverse(): 对查询结果反向排序
* distinct(): 从返回结果中剔除重复纪录
* values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
* count(): 返回数据库中匹配查询(QuerySet)的对象数量。
* first(): 返回第一条记录
* last(): 返回最后一条记录
* exists(): 如果QuerySet包含数据,就返回True,否则返回False。

 

######2.QuerySet对象

* 查询的结果集就是一个QuerySet对象

* QuerySet对象就像是一个列表,列表存储着查询出的结果,可以迭代,可以切片

* Django中QuerySet对象是惰性的,即你得到这个对象的时候并没有真正的在数据库中执行SQL语句,只有用到了QuerySet对象中的数据才会执行SQL语句

* 想判断QuerySet对象中是否有数据,若写成

 

```python

if obj:

```

仍然会执行SQL语句,若使用

```python

if obj.exists():

```

就可以避免这种问题。

* QuerySet对象的使用是有cache缓存的,即遍历第二次QuerySet对象的时候数据是从缓存中拿的,不会执行SQL语句

* 如果QuerySet对象数据量特别大,遍历时为了避免占用大量cache空间,可以将QuerySet对象转换成一个迭代器

 

######3.基础查找

得到对象后,查找字段

```python

student1=student.objects.filter(school_id=1)[0]
print(student1.num)

```

拿时外键对象的字段

```python

student1 = student.objects.filter(id=2)[0]
print(student1.school.name)

```

拿多对多关系的字段

因为是多对多关系,得到的会是一个QuerySet对象

```python

student1=student.objects.filter(id=2)[0]
print(student1.teacher.values('name'))

```

######4.使用'__'进行的查找

一对多

school_name为外键对象的字段

school为student表中设置的外键字段

```python

student1=student.objects.filter(id=2).values('school__name')
print(student1)

```

多对多

和一对多的查询方式一样

teacher为student表中设置的外键字段

```python

student1=student.objects.filter(id=2).values('teacher__name')
print(student1)

```

反向一对多

student__name中的student为表名

```python

result=school.objects.filter(student__name='student1').values('name')
print(result)

```

反向多对多

也和反向多对多一样

```python

result=teacher.objects.filter(student__id=2).values('name')
print(result)

```

其他查询条

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇django配置发送邮箱 下一篇python+scrapy环境搭建步骤描述

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目