第六章、创建多对多关系的三种方式

第六章、创建多对多关系的三种方式

一、创建多对多关系的三种方式

1. 全自动(推荐指度**)

全自动:利用 ManyToManyField 让 django 自动创建第三张表
优点:不需要手动创建第三张表
不足:由于第三张表不是你手动创建的,也就意味着第三张表中字段是固定的,无法做扩展
            class Book(models.Model):
                ...
                authors = models.ManyToManyField(to='Author')
            
            class Author(models.Models):
                ...

2. 纯手动(不推荐)

纯手动:手动创建第三张表,然后利用 Foreignkey 自己做两张表的关联
优点:第三张表可以新增任意字段,扩展性较高
不足:查询不方便,基于双下划线、对象的反向查询都不支持了
            class Book(models.Model):
                ...
                
            class Author(models.Models):
                ...
            
            class Book2Author(models.Model):
                book_id = models.ForeignKey(to='Book')
                author_id = models.ForeignKey(to='Author')
                create_time = models.DateField(auto_now_add=True)
                ...

3. 半自动(******)

半自动:自己创建第三张表,利用 ManyToManyField 在某张表指定关联关系
优点:可以自定义字段,依旧支持基于双下划线、对象的反向查询,可扩展性高
多对多字段的方法不支持了(add,set,remove,clear)
class Book(models.Model):
     ...
     authors = models.ManyToManyField(to='Author', through='Book2Author', through_fields=('book','author'))


class Author(models.Model):
     ...
    books = models.ManyToManyField(to='Book', through='Book2Author', through_fields=('author', 'book'))

class Book2Author(models.Model):
     book = models.ForeignKey(to='Book')
     author = models.ForeignKey(to='Author')
     create_time = models.DateField(auto_now_add=True)
 # through 告诉 django orm 书籍表和作者表的多对多关系是通过 Book2Author 来记录的
 # through fields 告诉 django orm 记录关系时用过 Book2Author 表中的 book 字段 和 author字段 来记录的(第一个参数 book 是  关联表查 book 所依赖的字段)
 # 但是,多对多字段的 add set remove clear 四个方法就用不了了
# 1.半自动 一定要加两个额外的参数
      through='Book2Author', through_fields=('book','author')
# 2.后面字段的顺序
      由第三张表通过哪个字段查询单表 就把哪个字段放前面

说明

orm只需要给我提供方便的查询方法
            第三种虽然可以使用orm查询方法  
            但是不支持使用
                add()
                set()
                remove()
                clear()
                 # 1.半自动 一定要加两个额外的参数
                through='Book2Author', through_fields=('book','author')
            # 2.后面字段的顺序
                由第三张表通过哪个字段查询单表 就把哪个字段放前面
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值