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)
```
其他查询条