参数
OneToOneField(),ForeignKey() 的参数如下
- to 要连接的模型
- to_field 要被关联的目标Model的字段
- on_delete 删除主表(被关联的表,也就是非OneToOneField,ForeignKey的表)时,当前表怎么处理。
CASCADE->联动删除
PROTECT ->抛出异常
SET_NULL->设为null
SET_DEFAULT->设为预定义的默认值
SET->设置为指定的值
DO_NOTHIND ->什么也不做
class Grade(models.Model):
id = models.AutoField(verbose_name='自增id', name="id", primary_key=True)
grade_name = models.CharField(verbose_name="班级名称", name="grade_name", max_length=200)
# grade_name = models.CharField(verbose_name="班级名称", db_column="grade_name", max_length=200)
create_time = models.DateTimeField(verbose_name='创建时间',name="create_time", auto_now_add=True) # 第一次赋值
update_time = models.DateTimeField(verbose_name='最后一次更新时间',name="update_time", auto_now=True) # 第二次赋值
class Meta:
db_table = "app_grade"
ordering=["-update_time","create_time"]
class GradeManager(models.Model):
"""
一对一
"""
id = models.AutoField(verbose_name='自增id', name="id", primary_key=True)
manager_name = models.CharField(verbose_name="班主任名称", db_column="manager_name", max_length=200,default=None)
create_time = models.DateTimeField(verbose_name='创建时间',db_column="create_time", auto_now_add=True) # 第一次赋值
update_time = models.DateTimeField(verbose_name='最后一次更新时间',db_column="update_time", auto_now=True) # 第二次赋值
# 下面会在数据库中生成grade_id字段
grade=models.OneToOneField(verbose_name='班主任表', to=Grade,on_delete=models.CASCADE)
class Meta:
db_table = "app_grade_manager"
ordering=["-update_time","create_time"]
class Student(models.Model):
"""
一对多
to: 关联的父 类
to_filed:
外键要放在 多表中
删除父表数据时,当前表与关联表的filed的行为。
ForeignKey->字段名称会自动拼接id, 因此对应的序列化对象要加上id
"""
id = models.AutoField(verbose_name='自增id', name="id", primary_key=True)
name = models.CharField(verbose_name='名字', name='name', max_length=200)
address = models.JSONField(verbose_name="地址信息", name="address")
create_time = models.DateTimeField(verbose_name='创建时间', name='create_time', auto_now_add=True) # 第一次赋值
update_time = models.DateTimeField(verbose_name='最后一次更新时间', name='update_time', auto_now=True) # 第二次赋值
# 下面会在数据库生成grade_id字段
grade = models.ForeignKey(verbose_name="关联外键", name="grade", to=Grade, on_delete=models.CASCADE)
class Meta:
db_table = "app_student"
ordering=["-update_time","create_time"]
一对一 查询
grade = Grade.objects.get(id=3)
print(grade.grademanager.manager_name) # 反向通过model小写名称引用
gradeManager = GradeManager.objects.get(id=1)
print(gradeManager.grade.grade_name) # 正向直接通过属性grade引用
一对多 查询
**************************************** 一,找到 “多” ************************************************
grade = Grade.objects.get(id=3)
for student in grade.student_set.all():
print(student.name)
*************************************** 多,找到"" ************************************************
s = Student.objects.()
# 这种写法(s.grade)会查一次数据库
print(s.grade.grade_name)
下面是优化的写法:
s = Student.objects.select_related("grade").all() #这种写法会用inner join
print(s.grade.grade_name)
意思是,将id=3的student拿到,同事将grade用 innor join同步查出来