Django day06 关系映射

目录

1.关系映射

    1.一对一映射

    2.一对多映射

    3.多对多映射

练习代码https://blog.csdn.net/zh__quan/article/details/82155617


1.关系映射

    1.一对一映射

        1.什么是一对一
            A表中的一条记录只能与B表中的一条记录相关联
            B表中的一条记录也只能与A表中的一条记录相关联

            典型代表:一夫一妻制

            在数据库中的实现:
                A表:设置 主键
                B表:增加一列,引用自A表的主键(外键),并且增加唯一约束
        2.语法
            在关联的两个类的任何一个类中,增加对另外一个类的引用
            属性 = models.OneToOneField(Entry)
            ex:
                class Wife(models.Model):
                    name = models.CharFiled(...)
                    age = models.IntegerField(...)
                    author = models.OneToOneField(Author)
        3.查询
            class Wife(models.Model):
                name = models.CharFiled(...)
                age = models.IntegerField(...)
                author = models.OneToOneField(Author)

            正向查询:通过 wife 找 author
                # 获取id为1的wife的信息
                wife = Wife.objects.get(id=1)
                # 再获取wife所关联的author
                author = wife.author
            反向查询:通过 author 找 wife
                Django 会通过 OneToOneField() 在关联的实体类中增加一个隐式属性,表示对当前实体的引用
                隐式属性名成为 :当前类名的全小写形式

                # 先获取id为2的author的信息
                author=Author.objects.get(id=2)
                # 再获取author对应的wife
                wife = author.wife

扫描二维码关注公众号,回复: 2985344 查看本文章

    2.一对多映射

        1.什么是一对多
            A表中的一条数据可以与B表中的任意多条数据相关联
            B表中的一条数据只能与A表中的一条数据相关联

            商品类型 与 商品之间的关系
            出版社(Publisher) 与 图书(Book)
        2.在数据库中的体现
            通过外键(Foreign Key) 来实现一对多
            在"多"表中增加外键(Foreign Key)对"一"表中的主键进行引用
        3.语法
            通过外键(Foreign Key)
            在"多"实体中,增加:
                属性 = models.ForeignKey(Entry)
        4.查询
            Book(多) 和 Publisher(一)

            class Book(models.Model):
                ... ...
                publisher = models.ForeignKey(Publisher)
            正向查询 : 通过 Book 查询 Publisher
                book=Book.objects.get(id=1)
                publisher=book.publisher
            反向查询 : 通过 Publisher 查询 Book
                Django会通过ForeignKey()向关联的类中增加一个隐式属性 : 当前类_set

    3.多对多映射

        1.什么是多对多
            A表中的一条记录可以与B表中的任意多条记录相匹配
            B表中的一条记录可以与A表中的任意多条记录相匹配
        2.在数据库中的体现
            必须创建第三张表,关联涉及到的两张表的数据
        3.语法
            在涉及到的两个类的任意一个类中,都可以增加对另外一个类的多对多的引用
                entry=models.ManyToManyField(Entry)
            ex:
                创建书籍和作者之间的多对多的引用
                    可以在书籍实体中,增加多作者的引用
                    可以在作者实体中,增加对书籍的引用
                    以上方式 二选一
                class Book(models.Model):
                    title = models.CharField(xxx)
                    publicate_date = models.DateField()
                    author = models.ManyToManyField(Author)
        4.查询
            class Book(models.Model):
                title = models.CharField(xxx)
                publicate_date = models.DateField()
                author = models.ManyToManyField(Author)

            正向查询:通过Book找到对应的所有的Author
                # 查询id为1的书籍的信息
                book=Book.objects.get(id=1)
                # 查询book对应的所有的作者
                authors=book.author.all()

                通过关联属性查询对应的所有信息
            反向查询:通过Author查询所有的Book
                Django会通过ManyToManyField()在关联类中增加一个隐式属性
                属性名:当前类_set
                # 查询id为2的Author的信息
                author = Author.objects.get(id=2)
                # 查询author对应的所有的书籍
                books=author.book_set.all()
        练习:
            创建 Author 与 Publisher 多对多关系
                1.查询 老舍 所签约的所有出版社
                2.查询 北京大学出版社 下所有的签约作者

练习代码https://blog.csdn.net/zh__quan/article/details/82155617

猜你喜欢

转载自blog.csdn.net/zh__quan/article/details/82260924