多对多的三种方法

多对多表关系的三种创建方法

 

全自动

  就是利用orm自动帮我们创建第三张关系表

  优点

    代码不需要你写 非常的方便 还支持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提供的简单的方法

  代码:

class Book(models.Model):
name = models.CharField(max_length=32)
    
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')

半自动

  1、代码

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) # 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')

  2、through_fields字段先后顺序

    判断的本质:

      通过第三张表查询对应的表 需要用到哪个字段就把哪个字段放前面

    也可以简化判断:当前表是谁 就把对应的关联字段放前面

  3、半自动可以使用orm的正反向查询 但是没法使用add,set,remove,clear这四个方法

需要掌握的是全自动和半自动 为了扩展性更高 一般我们都会采用半自动

 

END

posted @ 2022-03-08 15:16  Snails蜗牛  阅读(96)  评论(0编辑  收藏  举报