Django | ORM创建多对多表关系的三种方式

多对多三种创建方式

全自动:

# 利用orm自动帮我们创建第三张表关系。
class Book(models.Model):
    title = models.CharField(max_length=32)
    authors = models.ManyToManyField(to='Authors')  # 利用orm自动创建第三张关系表

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



# 优点:
	第三张关系表代码不需要自己写,非常的方便,还支持orm提供操作第三张关系表的方法(add,set...)
    
# 缺点:
	第三张关系表的扩展性极差(没有办法额外添加字段)
    

纯手动:

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


# 优点:第三张表完全取决于我们自己进行额外的扩展
# 缺点:需要自己写的代码较多,不能够再使用orm提供的简单的方法(不推荐使用)

半手动:

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')
    #                                  )
    # 多对多表关系外键字段可以创建在任意一张表中:throuth_fields字段先后顺序是:
    	判断的本质:
        	通过第三张表查询对应的表,需要用到那个字段就把那个字段放前面
            ('如果要通过关系表找到Book表,就把book字段放在前面')
        简化判断:
        	当前外键创建在那张表中,就把对应的关联字段放在前面
    
class Book2Author(models.Model):
    book = models.ForeignKey(to='Book')
    author = models.ForeignKey(to='Author')
    
# 半自动可以使用orm正反向查询:但是没法使用add,set,remove,clear这四个方法
# 总结:需要掌握的是全自动和半自动 因为半自动的扩展性更高 一般我们都会采用半自动,
比如:如果我们用全自动创建的多对多的关系表后,需要在关系表中添加新的字段,比如两个关系的绑定时间之类的,那么这时使用全自动就无法实现了,所以这时使用半自动就可以更方便后续的拓展
posted @ 2022-03-04 18:38  JasonBorn  阅读(98)  评论(0编辑  收藏  举报