有时候我们存数据的时候,将面临比较复杂的数据,可能多个之间有关联,小编也是刚刚学习了一下。
我们在app中的model创建模型。同时分配外键等关联内容。
# 学院表 class Dep(models.Model): d_id = models.AutoField(primary_key=True) d_name = models.CharField(max_length=20) def __str__(self): return ‘Stu_detail d_id=%s d_name=%s‘%(self.d_id,self.d_name) # 课程表 class Course(models.Model): c_id = models.AutoField(primary_key=True) c_name = models.CharField(max_length=20) def __str__(self): return ‘Stu_detail c_id=%s c_name=%s‘%(self.c_id,self.c_name) # 学生表 和学院表形成多对一 和课程表形成多对多 class Stu(models.Model): s_id = models.AutoField(primary_key=True) s_name = models.CharField(max_length=20) # 关联学院表 外键关联 on_delete 外键关联对象删除,就会执行sql语句 dep = models.ForeignKey(‘Dep‘,on_delete=models.CASCADE) # 关联课程表 多对多 course = models.ManyToManyField(‘Course‘) def __str__(self): return ‘Stu_detail s_id=%s s_name=%s‘%(self.s_id,self.s_name) class Stu_data(models.Model): s_id = models.OneToOneField(‘Stu‘,on_delete=models.CASCADE) age = models.IntegerField() gender = models.BooleanField(default=1) city = models.CharField(max_length=20,null=True) def __str__(self): return ‘Stu_detail s_id=%s age=%s gender=%s city=%s‘%(self.s_id,self.age,self.gender,self.city)
外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错!一般使用CASCADE
表示级联删除
执行完makemigrations和migrate的命令后,在数据库我们能看到5张表,其中多对多关系的ManyToManyField
方法自动生成了关系表.
我们定义相关的视图函数进行基础操作。
def test1(request): d1 = Dep(d_name=‘Programing Academy‘) d1.save() s1 = Stu(s_name=‘ben‘,dep_id=2) s1.save() return HttpResponse(‘保存成功%s, %s,%s‘%(s1,s1.s_name,d1.d_name))
我们对学院表和学生表都添加了一个数据。
如果想要对course表添加数据的话:
def test1(request): d1 = Dep(d_name=‘Programing Academy‘) d1.save() s1 = Stu(s_name=‘ben‘,dep_id=2) s1.save() c1 = Course.objects.get(c_id=3) s1.course.add(c1) print(c1.stu_set.all()) print(s1.course.all()) return HttpResponse(‘保存成功%s, %s,%s‘%(s1,s1.s_name,d1.d_name))
大致输出:
<QuerySet [<Stu: Stu_detail s_id=8 s_name=ben>, <Stu: Stu_detail s_id=9 s_name=ben>]>
<QuerySet [<Course: Stu_detail c_id=3 c_name=python>]>
我们定义模型的时候定义了course与Course类相关联的,所以我们可以直接进行添加或赋值。
但是,我们在Course里面只是定义了 c_id 和 c_name,所以我们不能直接调用。
如果模型I有一个ForeignKey,那么该ForeignKey 所指的模型II实例可以通过一个管理器回前面有ForeignKey的模型I的所有实例。默认情况下,这个管理器的名字为foo_set,其中foo 是源模型的小写名称。
print(c1.stu_set.all())
print(d1.stu_set.all())
输出:
<QuerySet [<Stu: Stu_detail s_id=8 s_name=ben>, <Stu: Stu_detail s_id=9 s_name=ben>, <Stu: Stu_detail s_id=10 s_name=ben>]> <QuerySet [<Stu: Stu_detail s_id=2 s_name=jia>, <Stu: Stu_detail s_id=3 s_name=mengmeng>, <Stu: Stu_detail s_id=4 s_name=mengmeng>, <Stu: Stu_detail s_id=5 s_name=mengmeng>, <Stu: Stu_detail s_id=6 s_name=mengmeng>]> <QuerySet [<Course: Stu_detail c_id=3 c_name=python>]>
我们对stu_data进行赋值:
sdt = Stu_data(city=‘he‘,age=20,s_id_id=8) sdt.save()
要注意写明 s_id_id的值,因为存在关联关系,第二次重复写入将会报错。
原文:https://www.cnblogs.com/a-runner/p/12633893.html