Django与一对多CRUD操作
外键类型在ORM中用来表示外键关联关系,一般吧ForcignKey字段设置在一对多中的【多】的一方。
首先构建模型类
学科与学生
# 学科和学生是一对多关系
#学科模型类
class Subject(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.IntegerField()
def __str__(self):
return '<obj: name:{}>'.format(self.name)
# 学生模型类
class Student(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
#to: 表示要关联的表格
#on_delete:表示:删除表格时的策略
# CASCADE:表示删除关联数据,与之关联的也删除
subject = models.ForeignKey(to='Subject',on_delete=models.CASCADE)
def __str__(self):
return '<obj: name:{}>'.format(self.name)
建立完模型类同步数据库,并刷新。
一对多CRUD操作
R:read 查询
def test2(request):
# 查询
# 张三对应的学科
# ⑴使用id
student_obj = models.Student.objects.get(name='张三')
subject_obj = models.Subject.objects.get(id=student_obj.subject_id)
print(subject_obj)
# ⑵使用外键
student_obj = models.Student.objects.get(name='张三')
subject_obj = student_obj.subject
print(subject_obj)
# 查看学python的学员
# 正向查询:从 有关系字段(建立连接的字段) 到 没有关系字段 的是正向查询。
# 反向查询:从 没有关系字段 到 有关系字段 的是反向查询。默认使用 【类名小写_set】来查询。
subject_obj = models.Subject.objects.get(name='python')
result = subject_obj.student_set.all()
print(result)
return HttpResponse('一对多 CRUD操作')
C:create 增加
def test2(request):
# 增加
# 新增学员 老马 学python
# ⑴
subject_obj = models.Subject.objects.get(name='python')
student_obj = models.Student()
student_obj.name = '老马'
# student_obj.subject = subject_obj #赋值对象 或下面一种方法
student_obj.subject_id = subject_obj.id #赋值id
student_obj.save()
# ⑵
models.Student.objects.create(
name='李二',
subject=subject_obj
)
#java 学科 新增一个学员 老七 (反向)
subject_obj = models.Subject.objects.get(name='java')
subject_obj.student_set.create(
name = '老七'
)
return HttpResponse('一对多 CRUD操作')
D:delete 删除
def test2(request):
# 删除
# 删除 id 为6
models.Student.objects.get(id=6).delete()
# 删除带 七 的
models.Student.objects.filter(name__contains='七').delete()
# 级联删除
# Java 学科关闭 subject表 Java删除 student表对应学 Java的学生删除
models.Subject.objects.filter(name='java').delete()
return HttpResponse('一对多 CRUD操作')
U:update 修改
def test2(request):
# 修改
# 张三转学Java
# ⑴
student_obj = models.Student.objects.get(name='张三')
subject_obj = models.Subject.objects.get(name='java')
student_obj.subject = subject_obj
student_obj.save()
# ⑵ 使用update
subject_obj = models.Subject.objects.get(name='java')
models.Student.objects.filter(name='李四').update(subject=subject_obj)
# 反向
student_obj = models.Student.objects.get(name='老马')
subject_obj = models.Subject.objects.get(name='java')
subject_obj.student_set.set([student_obj])
student_obj = models.Student.objects.get(name='李四')
student_obj1 = models.Student.objects.get(name='老马')
subject_obj = models.Subject.objects.get(name='python')
subject_obj.student_set.set([student_obj,student_obj1])
return HttpResponse('一对多 CRUD操作')