参考:https://blog.csdn.net/pugongying1988/article/details/72870264
关系字段:一对一,多对一,多对多
一对一: 现在有很多一对一辅导班,也就是上课时,一个老师对应一个学生,一个学生对应一个老师
多对一: 很多偏远山区的学校可能整个学校只有一个老师,这一个老师对应多个学生,所有的学生对应这一个老师
多对多: 而我们则很幸福,学校里有许多老师,一个老师教习一科,学生有多个老师,老师有多个学生。
- ForeignKey,对应的是一对多的关系,可以指定关联删除-**on_delete=models.CASCADE**,如果要关联的对象还没有定义好,可以使用其名字。
- limit_choices_to,可以限制关联返回的内容。
- related_name,可以让关联的对象反查到源对象,如果不想创建反向关联,则设置为"+"即可。需要注意的是,如果没有使用该Field,那么想要使用反向关联,则需要**foo_set**,foo为关联对象的小写名称,如果使用了该Field,则可以直接使用自己定义的名称。
- related_query_name,和上面的作用类似,同样可以反向查询,两者只需要设置一个即可。
- to_field,指定关联对象的字段名称,默认情况下为对方的主键。
- db_constraint,控制是否在数据库中为这个外键创建约束,默认为True。
- on_delete,可以实现CASCADE,级联删除;PROTECT,防止被引用对象删除,抛出ProtectedError;SET_NULL,将其设置成null;
SET_DEFAULT,设置成默认值;SET,可以传递值,同时还可以传递可调用对象;DO_NOTHING,不采取任何动作。
- ManyToManyField,对应的是多对多的关系。
-
OneToOneField,对应的是一对一的关系,其可以直接返回关系另一边的对象,最主要的用途是作为扩展自另外一个模型的主键。比如多表继承就是利用这样的原理,通过对子模型添加一个隐式的一对一关联关系到父亲模型实现的。
如果你没有指定其的related_name参数,那么Django将使用当前模型的小写名称作为默认值。 如果访问相应的对象不存在的话,则会抛出ObjectDoesNotExist的异常。 当设置**parent_link**为True时,??