多对多的三种创建方式

方法一:全自动

——利用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')

 

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


—— 不建议使用

 

 

方法三:半自动

class Book(models.Model):
    name = models.CharField(max_length=32)
    authors = models.ManyToManyField(to='Author',
                                     through='Book2Author',
                                     through_fields=('book', 'author')
                                     )


"""
through_fields字段先后顺序:
    判断的本质:
        通过第三张表查询对应的表,需要用到哪个字段就把哪个字段放前面
    简化判断:
        当前表是谁,就把对应的关联字段放前面
"""


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的正反向查询,但是没法使用add,set,remove,clear这四个方法

 

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

posted @ 2023-10-23 20:08  wellplayed  阅读(11)  评论(0编辑  收藏  举报