多对一表
在表中直接加入一个表列用来记录对应的表
语法
ForeignKey(to, on_delete, related_name=None, related_query_name=None,
limit_choices_to=None, parent_link=False, to_field=None,
db_constraint=True, **kwargs)
to : 要关联的表名。
on_delete : 当删除关联表中的数据时,当前表与其关联的行的行为。
related_name : 用于反向操作时,代替表名_set,即 related_name == 表名_set。
to_field : 表示需要关联的表的字段, 默认情况下会关联表的主键。
related_query_name : 用于反向操作时,代替表名 即 表名_set == related_query_name_set。也可用于连表查询
db_constraint : 表示是否在数据库中创建外建约束。
limit_choices_to: 在Admin或ModelForm中显示关联数据时,提供的条件。
parent_link: 在Admin中是否显示关联数据。(不常用)
多对一增、删、改、查
创建数据
- 首先创建老师数据
t1 = models.Teacher.objects.create(name=‘李老师’)
- 再创建学生数据
s1 = models.Student.objects.create(teacher=t1,name=‘张同学’)
查询:(分表层面和数据层面)
- 表层面:
查询所有李老师的学生
models.Student.objects.filter(teacher__name=‘李老师’)
- 数据层面:
张同学的老师
s1.teacher
改:
字段赋值再save
删:
直接delete,根据on_delete属性设置,做不同的动作
多对一关系反向查询:
- 数据层面:必须用小写类名_set
- 表层面:直接小写类名
多对多表
在多对多关系中,django默认会创建第三个表,来存储对应表的关系。
表结构
class Book(models.Model):
author = models.ManyToMany(to='author', relate_name='author')
"""
...字段
"""
class author(models.Model):
"""
...字段
"""
语法
ManyToManyField(to, related_name=None, related_query_name=None,
limit_choices_to=None, symmetrical=None, through=None,
through_fields=None, db_constraint=True, db_table=None,
swappable=True, **kwargs)
注意:在多对多关系中,django默认会创建第三个表,来存储对应表的关系。你也可以通过through来指定存放映射关系的表。
to : 要关联的表名。
symmetrical: 仅用于多对多自关联时,指定内部是否创建反向操作的字段。默认为True。
through:手动指定中间关联表。(需要在models.py中创建一个Model,并且其中包含两个相关联模型的外键)
through_fields:在中间表中,有多个关联对象的外建。django需要知道使用哪两个关联,through_fields = (field1,field2),注意field1应该是有ManyToManyField字段的关联模型外键名。
db_constraint:是否在数据库中创建外建约束
db_table:指定表名
多对多增、删、改、查
add() # 增加
remove(*[]) #删除,可以为数字(即id);对象;对象列表
delete #筛选后删除
clear() # 清空表,把所有关系的表全部清空
表对象.author.all()#返回所有多对多对应的表的可迭代的对象