zoukankan      html  css  js  c++  java
  • django学习第七天---创建多表结构,创建第三张表的三种方式,创建模型类时的一些元信息配置,多表增加

    图书管理系统作业知识点整理

          知识点1:
          print(request.POST.dict())#dict()方法能将QueryDict类型数据转换为普通字典类型数据
          传数据时,可以用**{}打散的方式来传输入,但是如果碰到models中有decimal类型的字段数据,那么update更新时,会对提交的数据进行decimal类型数据转换,发现有Decimal数据要存储,会将提交的数据转换为Decimal类型来存储,所有数据类型强转的过程,导致如果我们直接写**request.POST,会报错,所有引入了request.POST.dict()这个方法,其实如果说不涉及到强制类型转换失败的请求,参数直接写**request.POST就可以
          obj_list.update(
                **request.POST.dict()
          )
    
          知识点2:
          <form action="/edit_book/{{ id }}/" method="post">
          <form action="{% url 'edit_book' id %}" method="post">
          <form action="{% url 'edit_book' obj.id %}" method="post">
          <form action="{% url 'edit_book' obj.pk %}" method="post">
    

    orm多表操作

    表结构 修改点

          from django.db import models
          class Author(models.Model):
                #作者表
                ad = models.ForeignKey(to='AuthorDetail',to_field='id',on_delete=models.CASCADE)
                ad = models.ForeignKey('AuthorDetail',on_delete=models.CASCADE)#只是单纯的外键关系,需要手动指定唯一约束才可以,在orm中提供了一对一关系的类,叫作OneToOneField
                ad = models.OneToOneField('AuthorDetail')#foreignkey+unique
                
    

    创建表和字段时的一些参数

    创建一对一关系字段时的一些参数

          to    设置要关联的表
          to_field   设置要关联的字段
          on_delete   同ForeignKey字段  级联删除
    

    创建一对多关系字段时的一些参数

          to    设置要关联的表
          to_field   设置要关联的表的字段
          related_name 反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'
          related_query_name  反向查询操作时,使用的连续前缀,用于替换表名
          on_delete  当删除关系联表中的数据时,当前表与其关联的行的行为
    

    创建多对多关系字段时的一些参数

          to   设置要关联的表
          related_name   同ForeignKey字段
          related_query_name  同ForeignKey字段
          through  在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系 , 但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三表的表名
          through_fields   设置关联的字段
          db_table  默认创建第三张表时,数据库中表的名称
          示例:authors = models.ManyToManyField('Author',db_table='xx')
    

    创建第三张表时的三种方式(目前就是了解)

    • 方式1
          手动创建第三张表(没办法使用manytomanyfield提供的操作第三张表数据的方法)
          #向操作第三张,就需要自己写sql或者直接对第三张表来添加数据
          #比如models.Author2Book.objects.create(author_id=1,book_id=1,xx='oo')
          class Book(models.Model):
                title = models.CharFiled(max_length=32,verbose_name='书名')#vsrbose_name="中文",给模型类起一个可读的名字,用于在后台展示显示的名称,一般定义为中文
          class Author(models.Model):
                name = models.CharField(max_length=32,verbose_name="作者姓名")
          #自己创建第三张表,分别通过外键关联书和作者
          class Author2Book(models.Model):
                author = models.ForeignKey(to='Author')
                book = models.ForeignKey(to='Book')
                xx = models.CharField(max_length=32)#自定义的拓展字段
                class Meta:
                      unique_together = ("author","book")  #unique_together联合唯一索引
    
    • 方式2
          中介模型,orm提供的有些方法可以用,有些用不了,比如add添加数据的方法
          手动创建第三张表,并通过ManyToManyField来指定一下这个关系表
          class Book(models.Model):
                title = models.CharField(max_length=32,verbose_name="书名")
          #自己创建第三张表,并通过ManyToManyField指定关联
          class Author(models.Model):
                name = models.CharField(max_length=32,verbose_name="作者姓名")
                books = models.ManyToManyField(to="Book",through="Author2Book",through_fields=("author","book"))
                #through_fields接收一个2元组('field1','field2')
                #其中field1是定义ManyToManyField的模型外键的名(author),field2是关联目标模型(book)的外键名
          class Author2Book(models.Model):
                author = models.ForeignKey(to="author")
                book = models.ForeignKey(to="Book")
                #可以拓展其他的字段了
                xx = models.CharField(max_length=32)#拓展字段
                class Meta:
                      unique_together = ("author","book")
    
    • 方式3
          通过ManyToManyField自动生成第三张表
          class Book(models.Model):
                title = models.CharField(max_length=32,verbose_name="书名")
          #通过ORM自带的ManyToManyField自动创建第三张表
          class Author(models.Model):
                name = models.CharField(max_length=32,verbose_name="作者姓名")
                books = models.ManyToManyField(to="Book",related_name='authors')#自动生成的第三张表我们是没有办法添加其他字段的
    

    创建模型类时的一些元信息配置

          orm对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息,主要字段如下:
          class Author2Book(models.Model):
                author = models.ForeignKey(to="Author")
                book = models.ForeignKey(to="Book")
                class Meta:
                      unique_together=("author","book")
          db_table   orm在数据中心的表名默认是app_类名,可以通过db_table可以重写表名。db_table='book_model'
          index_together   联合索引
          unique_together  联合唯一索引
          ordering   指定默认按什么字段排序
                ordering = ['pub_date']
                只有设置了该属性,我们查询到的结果才可以被reverse(),否则是能对排序了的结果进行反转(order_by()方法排序过的数据)
    

    db_column指定列名称

          title = models.CharField(max_length=64,db_column='xx')
          author = models.ForeignKey(to='Author',db_column='ss')
    

    on_delete级联模式参数

          on_delete
          当删除关联表中的数据时,当前表与其关联的行的行为
          models.CASCADE
          删除关联数据,与之关联也删除
          models.DO_NOTHING
          删除关联数据,引发错误IntegrityError
          models.PROTECT
          删除关联数据,引发错误ProtectedError
          models.SET_NULL
          删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
          #pub = models.ForeignKey('Publish',on_delete=models.SET_NULL,null=True)
          models.SET_DAFAULT
          删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
          models.SET
          删除关联数据
          a.与之关联的值设置为指定值,设置:models.SET(值)
          b.与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
    

    ForeignKey的db_constraint参数

          关系和约束大家要搞清楚,我不加外键能不能表示两个表之间的关系,当然可以
          但是我们就不能使用orm外键相关的方法了,所以我们单纯的将外键换成一个其他字段类型,只是单纯的存着另外一个关联表的主键值是不能使用orm外键方法的
          #db_constraint=False只加两者的关系,没有强制约束的效果,并且orm外键相关的接口(方法)还能使用,所以如果将来公司让你建立外键,并且不能有强制的约束关系,那么就可以将这个参数改为Fasle
          customer = models.ForeignKey(vsebose_name="关联客户",to="Customer",db_constraint=False)
    

    增删改查

    增加

    • 一对一
          
          #如果使用的是模型类的关系属性名称来添加数据,那么属性名称对应的值必须是关联表中的某条记录的模型类对象
          au_obj = models.AuthorDetail.objects.get(id=1)
          models.Author.objects.create(
                name = '小刘',
                age = 26,
                ad = au_obj #其实存在数据库中的还是au_obj的id值
                )
          #如果使用数据库字段的形式来创建关系记录数据,那么需要使用数据库中表字段名称来指定数据(用的居多)
          au_obj = models.AuthorDetail.objects.get(id=1)
          models.Author.objects.create(
                name = '小王',
                age = 16,
                ad_id = 2 #直接使用关联表中的某条记录的id值的方法
                )
    
    • 一对多或多对一
          book表和publish表是多对一的关系
          添加记录和上面的一对一一样
          #写法1
          publish_obj = models.Publish.objects.get(id=1)
          models.Book.objects.create(
                title="娇艳人生",
                pub_date = '2008-09-09',
                price = 88.88,
                pub=publish_obj #某个出版社的模型类对象
                )
          #写法2
          models.Book.objects.create(
                title="金陵",
                pub_date = '2008-09-09',
                price=85.33,
                pub_id=1 #某个出版社记录的id值
                )
    
    • 多对多
          #作者和书籍表是多对多关系
          #比如一本书 少年阿宾 是两位作者合力创作的  小谢和小黑
          book_obj = models.Book.objects.create(
                title='少年阿宾',
                pub_date = '2020-07-10',
                price=2,
                pub_id=1
                )
          author_obj1 = models.Author.objects.create(
                name='小谢',
                age =16,
                ad_id=3 #直接使用关联表中的某条记录的id值的方法
                )
          author_obj2 = models.Author.objects.crate(
                name='小黑',
                age = 16,
                ad_id=4 #直接使用关联表中的某条记录的id值的方式
                )
          #方式1
          book_obj.authors.add(author_obj1,author_obj2)#写对应作者的模型类对象
          #方式2
          book_obj.authors.add(1,4)#直接写作者记录的id值
          #方式3
          book_obj = models.Book.objects.get(id=1)
          book_obj.authors.add(*[2,3])#直接写作者记录的id值
          app01_book_authors
          id   book_id   author_id
          1        3           3
          2        3           4
    

    -------------------------------------------

    个性签名:代码过万,键盘敲烂!!!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

  • 相关阅读:
    Visual Studio Code的常用快捷键
    requests模块
    爬虫基本原理
    Django-分页、中间件和请求的声明周期
    Django-admin管理工具
    Django-form表单
    Django-认证系统
    cookie、session和token
    Ajax
    Django进阶Model篇—数据库操作(ORM)
  • 原文地址:https://www.cnblogs.com/weiweivip666/p/13347946.html
Copyright © 2011-2022 走看看