1.表关系
外键 ForeignKeyField 一对多
OneToOneField 一对一
ManyToManyField 多对多
2.新建表
class Department(models.Model):
d_id = models.AutoField(primary_key=True)
d_name = models.CharField(max_length=30)
class Student(models.Model):
s_id = models.AutoField(primary_key=True)
s_name = models.CharField(max_length=30)
department = models.ForeignKey('Department', on_delete=models.CASCADE)
class StuDetail(models.Model):
student = models.OneToOneField('Student',on_delete=models.CASCADE)
age = models.IntegerField()
gender = models.BooleanField(default=1)
city = models.CharField(max_length=30,null=True)
class Course(models.Model):
c_id = models.AutoField(primary_key=True)
c_name = models.CharField(max_length=30)
student = models.ManyToManyField('Student')
3.添加数据
from .models import PyBlog,User,Department,Student
from django.http import HttpResponse
def add(request):
d1 = Department(d_name= '理学院')
d2 = Department(d_name= '外国语学院')
d1.save()
d2.save()
s1 = Student(s_name='胡磊')
s1.department = d2
s1.save()
return HttpResponse('添加成功')
4. 查找
4.1 正常查找
利用模型类自己的属性查找
d1 = Department.objects.get(d_id=1)
4.2 反向查找
利用与表相关的其他表的属性查找
d1 = Department.objects.get(d_id=1)
d1.student_set.all()
默认为方法名为:“表名_set”,可以通过related_name 对方法进行重新命名
4.3 多表查询
条件格式:关联表的小写+双下划线+字段名
department__d_name
Student.objects.filter(department__d_name=‘外国语’)
4.4 聚合查询aggregate
aggregate方法 返回一个query_set类型
from django.db.models import Count,Avg,Max,Min,Sum
User.objects.all().aggregate(Avg(‘age’))求出User表中所有人的平均年龄
4.5 分组查询
第一个values和Count中的参数一致,表示按这个参数分组,
最后的values中的参数表示按此参数的格式输出,
第一个单词为表名,表示查找的对象为学生,也就是查找按课程分组的学生
Student.objects.all().values(‘department’).annotate(count=Count(‘department’)).values(‘deparment_id’,‘count’)
4.6 F查询
F用于同一条数据中对字段进行取值
Student.objces.filter(department_id__gt=F(‘s_id’))
User.objects.all().update(age=F(‘age’)+1)
4.7 Q查询 多条件查询
User.objects.filter(Q(name=‘xiaoming’)|Q(name=‘xiaohong’))
| 或
& 和
~ 取反
5.表关系
5.1 修改 add 方法
d1 = Department.objects.get(d_id=1)
s1 = Student.objects.get(s_id=1)
di.student_set.add(s1)
add方法必须作用于已存在的数据
add方法可以同时添加多个,用逗号分隔
di.student_set.add(s1,s2)
5.2 创建 create方法
d1 = Department.objects.get(d_id=1)
d1.student_set.create(s_name=‘啦啦’)
6.删除 remove方法与clear方法
设置字段值允许为空
c1=Course.objects.get(c_id=1)
c1.student_set.remove(s1)
clear方法可以删除所有关系
c1.studengt_set.clear()
add,create,remove,clear这四个方法都不需要再调用save方法
remove 方法与表结构内字段是否允许为空有关
一对一结构没有add,create,remove,clear四个方法