django的多对多与多对单表

多对一表

在表中直接加入一个表列用来记录对应的表

语法

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=‘张同学’)

查询:(分表层面和数据层面)

  1. 表层面:
    查询所有李老师的学生
models.Student.objects.filter(teacher__name=‘李老师’)
  1. 数据层面:
    张同学的老师
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()#返回所有多对多对应的表的可迭代的对象

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值