Django-----(七)表关系

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四个方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值