一对多
外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在‘一对多’中‘多’的一方。
例如:一个学科对应多个学生,一个学生对应一个学科。
from django.db import models
# Create your models here.
#学生类
class Student(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
birthday = models.DateField()
#设置外键
subject = models.ForeignKey(to='Subject',to_field='id',on_delete=models.CASCADE)
def __str__(self):
return '<Student obj name : {}>'.format(self.name)
#学科类
class Subject(models.Model):
name=models.CharField(max_length=32)
price=models.IntegerField()
def __str__(self):
return '<Subject obj name : {}>'.format(self.name)
字段:ForeignKey
字段参数:
to:设置要关联的表
to_field:设置要关联的表的字段。默认关联的是表的id。默认的可以不写。
如果想关联其他字段名称可以使用此字段
on_delete:当删除关联表中的数据时,当前表与其关联的行的行为
行为可以有以下:
models.CASCADE:删除关联数据,与之关联也删除
models.DO_NOTHING:删除关联数据,引发错误 IntegrityError。
models.PROTECT:删除关联数据,引发错误ProtectedError。
增加
学生 赵四 学习 python学科
方式一:反向增加
#1、找到学科类中的python对象
sub_obj=models.Subject.objects.get(name='python')
#2、在学生类中创建学生赵四
sub_obj.student_set.create(
name='赵四',
age=20,
birthday='2000-02-11',
)
方式二:正向增加
#1、找到学科类中的python对象
sub_obg=models.Subject.objects.get(name='python')
#2、学生类创建对象
student_obj=models.Student()
#3、对象.属性中添加值
student_obj.name='赵四'
student_obj.age='20'
student_obj.birthday='1999-11-11'
student_obj.subject=sub_obg
#4、保存
student_obj.save()
查找
查找学生赵四的学科(正向查找)
#1、先找到赵四
student_obj=models.Student.objects.get(name='赵四')
#2、赵四对应的学科属性
subject_obj=student_obj.subject
print(subject_obj)#直接返回的是对象
#<Subject obj name : python>
查找学python的学生(反向查找)
# 1、找到python
sub_obj = models.Subject.objects.get(name='python')
#2、获取所有
student_obj_list=sub_obj.student_set.all()
print(student_obj_list)
#注意:返回的是列表
#<QuerySet [<Student: <Student obj name : 赵四>>]>
修改
(一对多时set里面不能是id)
1、反向操作:(使用set() 方法)
练习1:将赵四 修改成学java
sub_obj = models.Subject.objects.get(name='java')
student_obj = models.Student.objects.get(name='赵四')
sub_obj.student_set.set([student_obj])
# 可以修改多个学生对象。
#sub_obj.student_set.set([obj1,obj2,obj3......])
2、正向操作:(使用save()、update()方法)
(1).使用save()
练习1:李四转学python
student_obj = models.Student.objects.get(name='李四')
sub_obj = models.Subject.objects.get(name='python')
student_obj.subject = sub_obj
student_obj.save()
(2).使用update() --> 比save()操作简单。
练习1:李四转学java
sub_obj = models.Subject.objects.get(name='java')
models.Student.objects.filter(name='李四').update(subject=sub_obj)
删除
(1). 赵四退学
models.Student.objects.get(name='赵四').delete()
(2). python 解散,(级联删除对应的学生)
models.Subject.objects.get(name='python').delete()
版权声明:本文为achieve_success原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。