orm操作

Posted xuyangroot

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了orm操作相关的知识,希望对你有一定的参考价值。

(表之间的关系都在附件中)
ORM:就是通过操作类来进行操作数据库,省去了写sql的语句,变成写类的操作!
 
get()当取不到值时会报错,只是ORM中的,字典中get取不到值得时候回返回一个None
 
values():在queryset后面使用,本身还是个queryset类型,将原来的对象变成字典的形式,前面是字段,后面面是值。
values_list():在queryset后面使用,本身还是个queryset类型,将原来的对象变成元组的形式。
 
 
类得到的对象对应数据库中一张表中的一行数据。ORM只能对表进行操作(增删查改),不能对数据库进行操作(建库,删库),所以使用orm的时候需要手动创建库 。
技术图片
技术图片
使用默认的数据库,省去了setting.py和其他的操作,只是快捷!
技术图片
 
技术图片
上面的这种端口形式不能够记录你所操作过的orm,所以可以这样写
技术图片
技术图片
技术图片
技术图片
技术图片
技术图片
技术图片
create创建数据后,还会返回一个对象!
技术图片
 
使用上面的环境,每更改一次moduls,都需要重新导入,因为环境更改了
 
技术图片
 
技术图片
 
当数据库里的数据为空的时候,blank一定为空,blank只是admin的一个校验,最终还是需要数据库允许为空!两个成对出现
admin:是Django提供的后台数据库快速管理的一个工具,能够快速的对数据库操作,怎删改查数据!
    使用admin,需要先创建一个超级用户,Python manage.py createsuperuser
admin和Python提供的技术图片这个,和Navicat都是可视化工具,只是admin是页面类型的,
技术图片
技术图片
 
把orm执行的语句保存下来!
技术图片
 
这三个返回的都是对象列表,只是里面的值有所改变!
技术图片
技术图片
 
distinct去重,去重是去掉重复的同一个对象,比如用户有两个角色,角色中包含的权限有可能重复,则需要去重,把同一个权限对象删除掉,并不是根据字段去重,而是一条数据进行去重!
 
技术图片
 
 
当多对多的时候,这个字段创建在哪都可以,主要是看放在哪方便!
例如作者和书,一般都(人的惯性)是查看这个作者写了哪些书,而不是查这本书的作者是谁,所以多对多就可以写在作者的这一边!
技术图片
自动回产生一个表,用来记录多对多的关系!
 
 
整个项目的modules
<wiz_code_mirror>
 
 
 
 
 
from django.db import models
?
# 出版社表
class Plublisher(models.Model):
    name = models.CharField(max_length=32)
    def __str__(self):
        return "[出版社名字:{}]".format(self.name)
?
# 书
class Book(models.Model):
    title = models.CharField(max_length=32)
    price =models.IntegerField()
    publisher = models.ForeignKey(to="Plublisher")
    def __str__(self):
        return "[书名字:{}]".format(self.title)
?
?
#作者
class Author(models.Model):
    name = models.CharField(max_length=32)
    books = models.ManyToManyField(to="Book")
    def __str__(self):
        return "[作者名字:{}]".format(self.name)
 
 
 
技术图片
技术图片
技术图片
 
 
 
外键创建在多的哪一方!一定放在多的哪一方!这样才可以避免数据冗余!
 
 
技术图片
 
Django执行的语句有哪些!
技术图片
而publisher_id就不一样了。
技术图片
外键就是在表中多生成一个字段
技术图片
技术图片
    ret.publisher(这个得到的是出版社的对象,所以可以点出属性ret.publisher.name)这已经拿到了另一个对象了!!切记
技术图片
正向查询和反向查询!
从外键方向查是正向查询,返回来就是反向查询!字段写在book里面,所以是正向查询,但是从出版社没有改字段,但是有关联,所以是反向查询!
技术图片
正向查询!关联字段是本身类中的那个字段,)
技术图片
反向查询!里面用的是表名一定全小写)
技术图片
 
数据的获取方式可以正向查询,也可以反向查询
技术图片
 
基于对象和基于字段,他们已知的条件不一样!
技术图片
 
正反向查询和基于(字段/对象)查询没关系,正向的就是从外键那一方向。基于 字段/对象 是自己的已知条件有哪些!双下滑线就表示跨表(基于字段)!
下面这种也可以!
技术图片
虽然输出的结果都是一样的,但是内部做的事情不一样!
 
反向查询的时候 表名_set()非常不好记,就有related_name
技术图片
技术图片
 
 
 
 
<wiz_code_mirror>
 
 
 
 
 
沙河出版社出版的书:
    1)基于对象去查
        ret = modules.Publisher.objects.get(name="沙河出版社") #先得到对象
        ret.book_set.all()
    2)基于字段
        ret= modules.Book.objects.filter(publihser__name="沙河出版社")
        # 只要他们之间有关系,外键,多对多等等都可以。表名__字段名
 
 
基于字段的查询就是,前面选取的是哪个类,最后得到的全是这个类的结果!
技术图片一旦指定额,related_name后,book_set变成books,字段中也要把表名写成books这样才能跨表。
 
技术图片
多对多反向查询,book_obj.author_set.all()              book对象.表名_set.all()得到所有的对象。
 
正向查询:由多到一!!直接通过字段就可以进行查询!(说白了ForignKey写在哪个表中,那个表就是正向查询)
技术图片
 
 
反向查询:由一到多!  
技术图片
 
反向查询,先得到name="沙河出版社” 的对象,然后在跨表
技术图片
 
技术图片
 
技术图片
技术图片
 
多对多:ManyToManyFIeld()放在那里都一样,他是单独创建了第三张表。所有的都是通过管理对象弄得,所以一定要找准谁是管理对象!
技术图片
这些都是管理对象!
技术图片
 
create
技术图片
add方法
技术图片
 
set方法
技术图片
 
这就是ForeignKey的set方法技术图片
和下面是一样的
技术图片
技术图片
技术图片
 
 
聚合:就是将一些数据聚合起来,然后进行聚合函数得到一个数值,这个是数值是原表中没有的值avg,min,max,sum,count等等
技术图片
aggregate是终止字句,后面不能跟其他的语句。13条语句那个,得到一个之后,在点在进行一次筛选,链式操作。
 
分组:安某个条件分组,然后去分组中的数据。聚合函数中的条件(可以使自己的字段,可以使别的表中字段,可以是类名)
        分组的目的是拿到聚合的值,找到每个分组中的一些数据。
技术图片
  单表查询分组,和联表查询分组!(看博客)
 
分组是将分组条件添加到原来的对象中,组成键值对!
查找每一本书的做这个数。(还是原来的数据,只是将分组后得到的字段添加到原来的字段中,所以原来数据中的字段可以随便values)
技术图片
技术图片
技术图片
 
查询每个出版社出版书的最低价格(两个方法!):(annotate中直接可以写聚合函数,而且里面可以跨表查询!)
技术图片
技术图片
但是,下面的就有问题了
技术图片
 
 
 
 
count中直接写 author表名!
技术图片
 
 
queryset有Updata方法
技术图片
 
 
 
 
 
 
 
写完数据库后,如果只是单独的看数据,可以穿创建一个py文件,然后导入一些配置后就可以写ORM的语句了!
技术图片
 
 
技术图片
分组得到的是一个querySet的对象,并且里面还多了一个字段!最终想要得到书的价格,所以需要跨表!所以用book__price跨表查询! 双下滑线就是跨表查询(__)!
 
技术图片
 
分组,一定是有多的那个东西,比如书和作者,出版社和书   都是从一到多的方向,这样才能进行分组!
往多的地方进行分组
 
 
update只是更改你指定的字段,但是save会更新所有的字段(包括没有更改的字段!效率低)。
技术图片
取到单个对象,在进行set语句。
技术图片
 
F:可以取到一个字段中的某个值
F()取到的数值,可以直接进行加减乘除!F()就是把相应字段的值取出来!
    例如:去除销售量大于库存量的
技术图片
 
        将所有的销售量都翻倍(就可以验证F得到的是数值,可以进行加减乘除)
            技术图片
 
 
Q查询就是把每个都当做一个单独的查询条件,Q与Q之间可以进行 或与非的操作!
技术图片
 
 
事物:要成功都成功,要失败就回退到初始状态。(就算前面的数据写入数据库了,执行当中有个一个出错,那么写入数据库的数据也会被清除掉。回退到初始状态。)

以上是关于orm操作的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

Django之ORM操作

Django---ORM操作大全

Django-ORM操作数据库无数据问题