Django中ORM多对多三种创建方式(全自动-纯手动-半自动)

本文详细介绍了Django中处理多对多关系的三种方式:全自动、纯手动和半自动。全自动方式简洁但扩展性差,纯手动方式提供了更多自定义空间但代码量大。半自动方式结合了两者的优点,允许使用ORM进行查询,但限制了某些操作。通过`through`和`through_fields`参数,可以自定义中间表并指定关系字段,提高模型的灵活性。在实际开发中,为确保扩展性,通常推荐使用半自动方式。
摘要由CSDN通过智能技术生成
一:多对多三种创建方式
1.全自动: 利用orm自动帮我们创建第三张关系表
class Book(models.Model):
    name = models.CharField(max_length=32)
    authors = models.ManyToManyField(to='Author')



class Author(models.Model):
    name = models.CharField(max_length=32)

优点: 代码不需要自己写 非常方便 还支持orm提供操作第三张关系表的方法
不足之处: 第三张关系表的扩展性极差(没办法额外添加字段)
2.纯手动
class Book(models.Model):
    name = models.CharField(max_length=32)
    authors = models.ManyToManyField(to='Author')

class Author(models.Model):
    name = models.CharField(max_length=32)

class Book2Author(models.Model):
    book_id = models.ForeignKey(to='Book')
    author_id = models.ForeignKey(to='Author')

优点: 第三张表完全取决你自己进行额外的扩展
不足之处: 需要写的代码较多,不能再使用orm提供的简单的方法

不建议使用
3.半自动
class Book(models.Model):
    name = models.CharField(max_length=32)
    authors = models.ManyToManyField(to='Author', 
                                     through='Book2Author',
                                     through_fields=('book','author'))


class Author(models.Model):
    name = models .CharField(max_length=32)



class Book2Author(models.Model):
    book = models.ForeignKey(to='Book')
    author = models.ForeignKey(to='Author')
    
半自动:可以使用orm的正反向查询 但是没法使用add,set,remove,clear这四个方法
4.半自动全文解析
through : 告诉orm我跟作者是多对多的关系,我是通过我自己写的表创建关系的 该表Book2Author 创建关系

为何使用through='Book2Author'?
防止第三张表中还有其他字段,所以我们还需要一张表,来告诉第三张表, 书籍跟作者是通过哪些字段来绑定关系的

through_fields: 告诉orm书籍跟作者是通过book,author字段来绑定关系的
to = 'author'
让orm知道书籍跟作者是多对多

through = 'Book2Author'
并且告诉orm不需要再创建表,自己手动已经创建好了

through_fields
告诉orm书籍跟作者是通过book,author字段来绑定关系的
5.半自动through_fields=('book','author')的顺序
through_fields=('book','author')的顺序:

1.顺序由当前第三张查询对应关系的author表通过那个字段
2.通过book,所以book放在第一位,然后第二个字段放在第二位

through_fields字段先后顺序
    判断的本质:
        通过第三张表查询对应的表 需要用到哪个字段就把哪个字段放前面
    你也可以简化判断
        当前表是谁 就把对应的关联字段放前面
6.总结:
你需要掌握的是全自动和半自动 为了扩展性更高 一般我们都会采用半自动(写代码要给自己留一条后路)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值