django basis of the day09, many-create data tables in three ways



多对多三种创建方式
1.全自动(用在表关系不复杂的一般情况)
    class Book(models.Model):
        title=models.CharField(max_length=32)
        多对多关系字段
        authors=models.ManyToManyField(to='Authors')

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

    全自动创建第三张关系表的好处:
        至始至终都没有操作第三张表,全部都是由orm自动帮你创建的
        还内置了四个操作第三张表的方法
            add remove  set  clear

    不足之处:
        自动创建的第三张表无法扩展需要的字段,不支持修改,表的扩展性很差
        (封装程度越高,可扩展性越低)


2.纯手撸三张表(了解)
    class Book(models.Model):
        title=models.CharField(max_length=32)

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

    class Book2Authors(models.Model):
        book=models.ForeignKey(to='Book')
        author=models.ForeignKey(to='Authors')
        create_time=models.DateField(auto_now_add=True)

    好处:
        第三张表中字段个数和字段名称全都可以自己来定义

    不足之处:
        不再支持orm跨表查询,没有正反向查询的概念
        不支持add  remove  set  clear


3.半自动(推荐使用)


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

    class Book2Authors(models.Model):
        book=models.ForeignKey(to='Book')
        authors=models.ForeignKey(to='Authors')

    class Book(models.Model):
        title=models.CharField(max_length=32)
        #多对多关系字段
            authors=models.ManyToManyField(to='Authors',through='Book2Authors',through_fields=("book","authors"))




        '''
        1.当你的ManyToManyField只有一个参数的情况下,orm会自动帮你创建第三张关系表
        2.如果你加了through='第三张关系表表名',
          和through_fields=("关系表表字段1","关系表表字段2"),
          ,那么orm就不会自动帮你创建第三张表,但是它会在内部帮你维护表关系,让你能够继续使用orm的跨表查询

        3.through_fields=("第三张关系表表字段1","第三张关系表表字段2")中字段放置上是有顺序的,
        注意事项:
            Book表中多对多关系字段,:
            authors=models.ManyToManyField(to='Authors',through='Book2Authors',through_fields=("book","authors"))
            through_fields【!!放在哪张表中,该表的表名就放在前面!!】

        4.
          through='第三张关系表表名',
          through_fields=("第三张关系表表字段1","第三张关系表表字段2"),


        '''














Guess you like

Origin www.cnblogs.com/ludundun/p/11978754.html