表关系

  有时候我们存数据的时候,将面临比较复杂的数据,可能多个之间有关联,小编也是刚刚学习了一下。

  我们在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的值,因为存在关联关系,第二次重复写入将会报错。

posted @ 2020-04-04 20:17  为红颜  阅读(67)  评论(0编辑  收藏