Django—模型对应关系(一对一)

  • 一对一模型


    #⼀个学⽣有⼀个档案,⼀个档案属于⼀个学⽣,那么学⽣表和档案表就是⼀对⼀关
    #系。学⽣表是主表,档案表是从表,从表中有⼀个外键和学⽣表关联,并且要求外
    #键取值唯⼀。对应关键字为:OneToOneField
    #创建模型
    class Student(models.Model):
     sno = models.CharField(max_length=6,primary_key=True)
     sname = models.CharField(max_length=100,null=False)
     ssex = models.CharField(max_length=2,default='男',null=True)
     sage = models.IntegerField(null=True)
     sclass = models.CharField(max_length=10,null=True)
     def __str__(self):
     return "no:{},name:{}".format(self.sno,self.sname)
     class Meta:
     db_table = 'student'
    class Archives(models.Model):
     idcard = models.CharField(max_length=18, unique=True)
     address = models.CharField(max_length=200,null=True)
     # on_delete=models.CASCADE 级联删除,删除学⽣会连同档案⼀块删除
     student = models.OneToOneField(Student, on_delete=models.CASCADE)
     def __str__(self):
     return "{},{}".format(self.idcard,self.address)
     class Meta:
     db_table = 'archives'
  • 增加数据


    def addstudent(request):
     student = Student()
     student.sno = '180502'
     student.sname = '杨康'
     student.sage = 22
     student.save()
     return HttpResponse("增加了⼀个学⽣")
    def addarchives(request):
     stu = Student.objects.get(pk='180503')
     arc = Archives()
     arc.idcard = '130098384893838953'
     arc.student = stu #学⽣对象必须已经保存到数据库,否则错误
     arc.save()
     return HttpResponse("增加档案")
  • 删除数据


    def deletestudent(request):
     student = Student.objects.get(pk='180503')
     student.delete()
     return HttpResponse("删除")
  • 正反向查询


    # 正向查询
    def findstudent(request):
     # 获取学⽣信息
     student = Student.objects.first()
     print(student)
     # 通过学⽣对象获取档案信息
     archive = student.archives
     print(archive)
     return HttpResponse(student)
    
    
    #反向查询
    def findarchives(request):
     #获取档案记录
     archive = Archives.objects.first()
     #通过档案获取关联学⽣信息
     student = archive.student
     return HttpResponse(student)
  • 跨关系查询


    def lookup(request):
     #根据档案查学⽣
     # student = Student.objects.get(archives__pk=1)
     student =
    Student.objects.get(archives__idcard='13009488384383838')
     #根据学⽣查档案
     archive = Archives.objects.get(student__sno='180501')
     return HttpResponse(archive)
  • 级联删除


    on_delete
    CASECADE 默认,默认级联删除数据
    PROTECT 保护模式,当从表中存在级联记录的时候,删除主表记录会抛
    出保护异常,从表中不存在级联数据的时候,是允许删除的
    SET_XXX
    NULL 外键字段本身必须允许为空
    DEFAULT 外键字段本身有默认值
    DO_NOTHING 什么都不做
发布了180 篇原创文章 · 获赞 6 · 访问量 2317

猜你喜欢

转载自blog.csdn.net/piduocheng0577/article/details/105010237