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

      知识点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

django学习第七天---创建多表结构,创建第三张表的三种方式,创建模型类时的一些元信息配置,多表增加的更多相关文章

  1. 内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

    内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式. 一丶IDT解析. 我们知道.IDT表中存放着各种中断信息.比如当我们调用int 3的时候,则会调用IDT表中的第三项来进行调用. 而函数 ...

  2. 创建多线程的第一种方式——创建Thread子类和重写run方法

    创建多线程的第一种方式——创建Thread子类和重写run方法: 第二种方式——实现Runnable接口,实现类传参给父类Thread类构造方法创建线程: 第一种方式创建Thread子类和重写run方 ...

  3. 两种方式创建Maven项目【方式二】

    1.不勾选Create a simple project,直接点击下一步 2.选择maven-archetype-webapp下一步 3.填写相关信息,点击下一步完成 4.此时会报一个jsp的错误.我 ...

  4. 两种方式创建Maven项目【方式一】

    经常使用maven进行项目的管理,今天整理两种方式创建maven项目及创建过程中碰到的问题怎么解决: 方式一: 1.新建maven项目,点击下一步. 2.勾选Create a simple proje ...

  5. 测开之数据类型&#183; 第3篇《列表推导式、字典推导式、2种方式创建生成器》

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.列表推导式 二.字典推导式 三.2种方式创建生成器 1.生成器表达式 2.函数里面,通过 y ...

  6. 【Django drf】 序列化类常用字段类和字段参数 定制序列化字段的两种方式 关系表外键字段的反序列化保存 序列化类继承ModelSerializer 反序列化数据校验源码分析

    目录 序列化类常用字段类和字段参数 常用字段类 常用字段参数 选项参数 通用参数 序列化类高级用法之source source填写类中字段 source填写模型类中方法 source支持跨表查询 定制 ...

  7. 三种方式创建bean对象在springIOC容器中初始化、销毁阶段要调用的自定义方法

    1. 使用@Bean注解定义initMethod和destroyMethod 所谓initMethod和destroyMethod,是指在springIOC容器中,对于bean对象执行到初始化阶段和销 ...

  8. Springboot 创建的maven获取resource资源下的文件的两种方式

    Springboot 创建的maven项目 打包后获取resource下的资源文件的两种方式: 资源目录: resources/config/wordFileXml/wordFileRecord.xm ...

  9. Django学习(七)---添加新文章页面

    在template中添加add_article.html页面 (form  input)请求方法使用post 这个页面涉及到了两个响应函数 1)显示页面的响应函数  2)表单提交的响应函数 add_a ...

  10. Django 学习第七天——Django模型基础第二节

    User 是自己创建的模型类,等于数据库中的表 常用的查询方法: all():获取所有数据: User.objects.all() first():获取第一条数据: User.objects.firs ...

随机推荐

  1. [转帖]深度解读:传奇的Alpha处理器

    https://jishuin.proginn.com/p/763bfbd2cf85 来源:科技新报(台) 长期关心处理器技术发展者,这20年来,很难不每隔一段时间就会偶尔听到「这技术受Alpha影响 ...

  2. 我在京东做研发 | 京东云算法科学家解析爆火的ChatGPT

    令人惊艳的ChatGPT横空出世 背后有怎样的前沿技术支撑 走向大规模产品应用又有何局限 深耕对话式AI技术十余年 京东云算法科学家将带您一同走进技术世界 解析ChatGPT的技术亮点与局限 分享下一 ...

  3. python代码的tab和空格缩进互转

    代码规范 在我们项目中python代码使用tab缩进,并统一大家的编辑器设置. 如果同一个python文件中即有空格又有tab缩进,那么运行此文件会报错. 关于使用空格还是tab,这里就不展开讨论了, ...

  4. 使用protobuf生成代码import包找不到

    protobuf使用import导入包找不到 前言 解决方案 protobuf使用import导入包找不到 前言 使用protobuf生成go代码,发现protobuf中一个import引用找不到 p ...

  5. 阿里天池实验室简明教程以及Docker安装使用[一]

    1.天池notebook简介和使用 天池实验室是基于PAI DSW探索版开发的,PAI DSW (Data Science Workshop)是为算法开发者量身打造的云天池实验室是基于PAI DSW探 ...

  6. PGL图学习项目合集&数据集分享&技术归纳业务落地技巧[系列十]

    PGL图学习项目合集&数据集分享&技术归纳业务落地技巧[系列十] 1.PGL图学习项目合集 1.1 关于图计算&图学习的基础知识概览:前置知识点学习(PGL)[系列一] :ht ...

  7. 5.7 Windows驱动开发:取进程模块函数地址

    在笔者上一篇文章<内核取应用层模块基地址>中简单为大家介绍了如何通过遍历PLIST_ENTRY32链表的方式获取到32位应用程序中特定模块的基地址,由于是入门系列所以并没有封装实现太过于通 ...

  8. centos7.9重启网卡提示Failed to start LSB: Bring up/down networking.

    前几天给一台机器状态centos7.9系统,设备有2个网口,今天重启网卡一直失败, 查看network状态,怀疑是eth0网卡有问题 查看eth0的网卡配置,发现是eth0网卡的BOOTPROTO=d ...

  9. Go语言的100个错误使用场景(11-20)|项目组织和数据类型

    目录 前言 2. Code and project organization 2.11 没有使用函数式选项模式(#11) 2.12 项目缺乏组织(#12) 2.13 创建公共设施包(#13) 2.14 ...

  10. SDK多项目开发与联调

    在SDK开发中,因为是往外提供的功能静态库,所以在开发的时候要验证开发的SDK是否功能正常,这里就需要做进行边开发边联调的工作. 下面使用的开发模式是创建一个WorkSpace工作工具,SDK项目和D ...