模型搭建:
学科与学员:一对多关系
# 学科与学生:一对多关系
# 学科模型类
class Subject(models.Model):
id = models.AutoField(primary_key=True) # id主键
name = models.CharField(max_length=24) # 学科名称
price = models.IntegerField() # 学费
def __str__(self):
return "<Sub_obj:{}>".format(self.name) # 打印对象
# 学生模型类
class Student(models.Model):
id = models.AutoField(primary_key=True) # id主键
name = models.CharField(max_length=24) # 学员名字
# 外键字段,创建数据库会生成subject_id外键字段 ,subject也作为一个Subject实例化的对象
subject = models.ForeignKey(to='Subject',on_delete=models.CASCADE)
def __str__(self):
return "<Stu_obj:{}>".format(self.name)
同步数据库:
添加数据:
学科表(subject)
学员表(student)
一、查询操作R(3种方式)
正向查询(以多表为主)
1、通过对象方式
# 查询操作
def search(request):
# 正向查询 从学生表查找 查询张三的学科(两种方式)
# 获取张三的学生模型类对象
student_obj = models.Student.objects.get(name='张三')
# 通过学生模型类中subject对象获取学科类对象
subject_obj = student_obj.subject
print(subject_obj)
print(subject_obj.name)
return HttpResponse("是你呀!")
2、通过外键id值获取学科信息
def search(request):
student_obj = models.Student.objects.get(name='张三')
subject_obj = models.Subject.objects.get(id=student_obj.subject_id)
print(subject_obj)
return HttpResponse("是你呀!")
3、反向查询(以一表为主,Django默认提供了一表与多表的关联字段)
def search(request):
#反向查询 从学科表查找 查询所有学科的学生
subject_obj = models.Subject.objects.get(id=1)
# 类名小写_set 属性进行关联
result = subject_obj.student_set.all()
print(result)
return HttpResponse("是你呀!")
二、添加操作C(3种方式)
新增学员赵六,python学科
1、save()方法添加
def add(request):
# 新增学员,python学科 save()
sub_obj = models.Subject.objects.get(name='python')
# 实例化一个新的学员对象
stu_obj = models.Student()
stu_obj.name = "赵六" # 赋值name
# stu_obj.subject = sub_obj # 赋值对象
stu_obj.subject_id = sub_obj.id # 赋值id
stu_obj.save()
return HttpResponse("添加成功")
2、create()方法添加
def add(request):
#create() # 方式添加
sub_obj = models.Subject.objects.get(name='python')
stu_obj = models.Student.objects.create(
name="赵六",
subject=sub_obj
)
print(stu_obj)
return HttpResponse("添加成功")
3、反向添加,基于学科表
def add(request):
sub_obj = models.Subject.objects.get(name='python')
sub_obj.student_set.create(
name="赵六"
)
return HttpResponse("添加成功")
三、删除操作D
# 删除操作
def delete(request):
# 删除单条记录
models.Student.objects.get(name='赵六').delete()
# 同时删除多条记录
models.Student.objects.filter(name__contains='四').delete()
return HttpResponse("删除成功")
四、修改操作U(3种方式)
王五转学java
1、save()方法
# 修改操作
def update(request):
# 使用save()王五转学java
# 获取java的学科表模型对象
sub_obj = models.Subject.objects.get(name='java')
# 获取王五的学员表模型对象
stu_obj = models.Student.objects.get(name='王五')
# 对象赋值
stu_obj.subject = sub_obj
# 保存操作
stu_obj.save()
return HttpResponse("修改成功")
2、update()方法
def update(request):
sub_obj = models.Subject.objects.get(name='java')
# 这里使用filter是由于filter返回的是QuerySet对象,可以使用update方法,而get不可以
stu_obj = models.Student.objects.filter(name="王五").update(
subject = sub_obj
)
return HttpResponse("修改成功")
3、反向修改
def update(request):
# 反向修改
sub_obj = models.Subject.objects.get(name='python')
stu_obj = models.Student.objects.get(name="王五")
stu_obj2 = models.Student.objects.get(name="赵柳")
# 这里的set方法不会提示,而且得传递列表,列表中存放学员对象
sub_obj.student_set.set([stu_obj,stu_obj2])
return HttpResponse("修改成功")