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

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

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

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)

说明

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

猜你喜欢

转载自www.cnblogs.com/demiao/p/11760883.html