关联对象操作及多表查询
关联表的数据操作
一对多
正向:如果一个模型有外键字段,通过这个模型对外键进行操作叫做正向。
--增:
- 通过属性赋值的方式,
- 通过主键的方式
总结:ForeignKey字段的更新,和普通的字段一样。
删:只有外键设置为null=True,可以通过赋值None来删除关系。
查:
通过ForeignKey字段模型的字段
反向:如果一个模型如果被另外一个模型外键关联,通过这个模型对关联他的模型进行操作叫做反向
查:通过管理器,默认管理器,有外键的模型名称的小写加上_set(foo_set,foo是模型名称小写),通过这个管理器可以查询模型的实例,在定义外键的时候,通过relaed_name
可以覆盖这个名称。
增:
- 通过add方法,可以添加多个
- 通过create方法
删:(关系删掉,不会把数据对象删掉)
remove(obj1,obj2,obj3)
clear()清空
总结:
add ,remove,clear等直接操作数据库。
改:替换对象集
set([s1,s2])
多对多:
如果因为有额外字段,自定义了中间模型,我们需要通过中间模型的管理器,进行manytomany关系的创建和删除。
默认情况,和一对多中的,add,create,remove,clear等等。
唯一的区别是:多对多
多对多正向的时候,
一对一:非常一对一字段,增删改查和普通字段没区别
反向的时候使用,使用模型的小写,也可以使用related_name覆盖,这个就不是管理器,就是一个普通属性。
注意:一个被一对一管理的模型,它的实例如果没有被分配关系
实例:学生对象,没有分配一个学生详情对象,如果去取,会抛出异常,DoseNoteExist.
跨表查询
例如,查询男生都报名了什么课程?
去重:
总结:要跨越关系,只需要使用跨越模型的相关字段的字段名,以下划线分隔,直到到达你想要的字段为止。这个关系要多深有多深。
查询所有报名Python课程的学员。
查询所有报名了Python全栈课程,在django框架第7期的学员:
学员报名了Python课程的班级有哪些?