一对一:
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.修改和删除就是基本的操作