一对一、一对多、多对多模型关系的建立和增删改查要注意的问题

一对一、一对多、多对多模型关系的建立和增删改查要注意的问题

一对一:

1.在维护关系的一方使用:models.OneToOneField(另一个一方模型类名称,on_delete=models.CASCADE)

eg:

from django.db import models

class Wife(models.Model):
    name = models.CharField(max_length=10)
    age = models.IntegerField()
    
    #重写
    def __str__(self):
        return self.name

    #表的重命名
    class Meta:
        db_table = 'a_wife'

class Husband(models.Model):
    name = models.CharField(max_length=10)
    age = models.IntegerField()

    #一对一关联
    o2o = models.OneToOneField(Wife,on_delete=models.CASCADE)

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'a_husband'

2.非维护关系的一方模型对象创建:

   1)变量名 = 非维护关系的一方对象模型名.对象管理器(非自定义默认为objects).create(字段名=值,...)

   2)非维护关系的一方对象模型名.对象管理器(非自定义默认为objects).create(字段名=值,...)

   3)变量名 = 非维护关系的一方对象模型名(字段名=值,...)

      变量名.save()进行保存

维护关系一方的模型的创建:

1)通过非维护关系一方的实例化对象关联

变量名 = 维护关系一方模型对象名.对象管理器(非自定义默认为objects).create(字段名=值,...关联变量名=非维护关系一方实例变量名)

2)通过对应表的外键关联

变量名 = 维护关系一方模型对象名.对象管理器(非自定义默认为objects).create(字段名=值,...关联变量名_非维护关系一方主键字段名=非维护关系一方主键字段值)

eg:

# 1)
w1=Wife.objects.create(name='小妖',age=25);
# 2)
Wife.objects.create(name='小妖',age=25);
# 3)
w3=Wife(name='小妖',age=25);
w3.save()

3.非维护关系的一方模型对象的删除:

   变量名 = 非维护关系的一方对象模型名.对象管理器(非自定义默认为objects).git(字段名=值,...)

   变量名.delete()

eg:

#在不维护关系的一方进行删除时:因为在维护关系的一方与其进行了关联,即在维护关系的一方有其数据的存在,所以不维护关系一方的数据删除后,维护关系的一方的与其有关联的数据也会一并删除
#在维护关系的一方进行删除时,则不会影响不维护关系一方的表的数据
d2=Wife.objects.get(id=2);

d2.delete();

4.非维护关系的一方模型对象的修改:

   先进行查找:变量名 = 非维护关系的一方对象模型名.对象管理器(非自定义默认为objects).git(字段名=值,...)

   变量名.字段名 = 修改后的值

   变量名.save()

eg:

h=Husband.objects.get(id=2);

h.name='颙颜';

h.save()

 

           5.其实查找问题一直贯穿其它几个操作之中。

一对多:

1.模型建立需要注意:多方模型内创建外键类属性,关联一方:

变量名 = models.ForeignKey(一方模型类名称,on_delete=models.CASCADE)

2.模型创建:

一方:参考一对一中的创建

多方:

1)通过“一”方的实例化对象关联

2)通过对应表的外键关联

3)通过“一”方添加对象:变量名 = 一方实例化对象.多方对象模型名_set.create(字段名=值,...)

3.查询:

从一方查询多方:使用“多”方模型类小写_set,作为“一”方容器。

从“多”方查询“一”方: 使用“多”方外键属性直接获取对应的“一”方实例

4.删除、修改就是基本的操作

多对多:

1.多方创建模型关系

models.ManyToManyField(另一个多方模型类,through="中间关系模型类")

eg:

#在中间模型类中至少有两个外键类属性,分别关联两个多方模型。
     
     class Student(models.Model):
           pass

     class Course(models.Model):
         name = models.CharField(max_length=10)
         stu = models.ManyToManyField(Student,through="Student_Course") # 多对多关系

     class Student_Course(models.Model):   # 中间模型,负责维护两个“多方”模型
         student = models.ForeignKey(Student,on_delete=models.CASCADE)  # 关联Student模型的外键
         course = models.ForeignKey(Course,on_delete=models.CASCADE) # 关联Course模型的外键
         score = models.FloatField()

2.维护关系的和不负责维护关系的创建都是通过基本的创建方式实现

第三方关系表的创建则可以用实例化对象关联和外键值关联

    #使用实例化对象关联
       sc1 = Student_Course.objects.create(student=stu1,course=course1,score=85)
    #使用外键值关联
       sc3 = Student_Course.objects.create(student_id=3,course_id=1,score=69)

3.查询:

从不负责的多方查询另一个多方

    #例如:1号学生选的课程
        student1 = Student.objects.get(id=1)
        courses = student1.course_set.all()  # 对方模型类小写_set

从负责关联的多方查询另一个多方
       

    #例如:查询选择2号课程的学生
       course2 = Course.objects.get(id=2)
       students = course2.stu.all()  # stu为关联类属性

4.修改和删除就是基本的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值