django--ORM

django--ORM,第1张

概述1、什么是ORM   MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配 置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动   ORM是“对象-关系-映射”的简称。 2、单表 *** 作 (1)、创建表 (1)、创建模型 在app的moels.py文件中: from dj 1、什么是ORM

  MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配

置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动

  ORM是“对象-关系-映射”的简称。

2、单表 *** 作 (1)、创建表

(1)、创建模型

在app的moels.py文件中:

from django.db import models# Create your models here.class Book(models.Model):    nID = models.autoFIEld(primary_key=True)  # 设置自增且主键    Title = models.CharFIEld(max_length=32)  # 字符串形式    price = models.DecimalFIEld(max_digits=8,decimal_places=2)  # 最大8位,得有两个浮点型    pub_date = models.DateTimeFIEld()  # 2021-01-09    public = models.CharFIEld(max_length=32)

  这里设置了表中每个字段的名字,类型和约束。如图,类名即表名。

  下面归纳了一些常见的字段:

<1> CharFIEld        字符串字段,用于较短的字符串.        CharFIEld 要求必须有一个参数 maxlength,用于从数据库层和Django校验层限制该字段所允许的最大字符数. <2> IntegerFIEld       #用于保存一个整数. <3> floatFIEld        一个浮点数. 必须 提供两个参数:                 参数    描述        max_digits    总位数(不包括小数点和符号)        decimal_places    小数位数                举例来说,要保存最大值为 999 (小数点后保存2位),你要这样定义字段:                                 models.floatFIEld(...,max_digits=5,decimal_places=2)                要保存最大值一百万(小数点后保存10位)的话,你要这样定义:                                 models.floatFIEld(...,max_digits=19,decimal_places=10)                admin 用一个文本框(<input type="text">)表示该字段保存的数据. <4> autoFIEld        一个 IntegerFIEld,添加记录时它会自动增长. 你通常不需要直接使用这个字段;        自定义一个主键:my_ID=models.autoFIEld(primary_key=True)        如果你不指定主键的话,系统会自动添加一个主键字段到你的 model. <5> BooleanFIEld        A true/false fIEld. admin 用 checkBox 来表示此类字段. <6> TextFIEld        一个容量很大的文本字段.        admin 用一个 <textarea> (文本区域)表示该字段数据.(一个多行编辑框). <7> EmailFIEld        一个带有检查Email合法性的 CharFIEld,不接受 maxlength 参数. <8> DateFIEld        一个日期字段. 共有下列额外的可选参数:        Argument    描述        auto_Now    当对象被保存时,自动将该字段的值设置为当前时间.通常用于表示 "last-modifIEd" 时间戳.        auto_Now_add    当对象首次被创建时,自动将该字段的值设置为当前时间.通常用于表示对象创建时间.        (仅仅在admin中有意义...) <9> DateTimeFIEld         一个日期时间字段. 类似 DateFIEld 支持同样的附加选项. <10> ImageFIEld        类似 fileFIEld,不过要校验上传对象是否是一个合法图片.#它有两个可选参数:height_fIEld和wIDth_fIEld,如果提供这两个参数,则图片将按提供的高度和宽度规格保存.    <11> fileFIEld     一个文件上传字段.     要求一个必须有的参数: upload_to,一个用于保存上载文件的本地文件系统路径. 这个路径必须包含 strftime #formatting,该格式将被上载文件的 date/time     替换(so that uploaded files dont fill up the given directory).     admin 用一个<input type="file">部件表示该字段保存的数据(一个文件上传部件) .      注意:在一个 model 中使用 fileFIEld 或 ImageFIEld 需要以下步骤:            (1)在你的 settings 文件中,定义一个完整路径给 MEDIA_ROOT 以便让 Django在此处保存上传文件.            (出于性能考虑,这些文件并不保存到数据库.) 定义MEDIA_URL 作为该目录的公共 URL. 要确保该目录对             WEB服务器用户帐号是可写的.            (2) 在你的 model 中添加 fileFIEld 或 ImageFIEld,并确保定义了 upload_to 选项,以告诉 Django             使用 MEDIA_ROOT 的哪个子目录保存上传文件.你的数据库中要保存的只是文件的路径(相对于 MEDIA_ROOT).             出于习惯你一定很想使用 Django 提供的 get_<#fIEldname>_url 函数.举例来说,如果你的 ImageFIEld             叫作 mug_shot,你就可以在模板中以 {{ object.#get_mug_shot_url }} 这样的方式得到图像的绝对路径. <12> URLFIEld      用于保存 URL. 若 verify_exists 参数为 True (默认),给定的 URL 会预先检查是否存在( 即URL是否被有效装入且      没有返回404响应).      admin 用一个 <input type="text"> 文本框表示该字段保存的数据(一个单行编辑框) <13> NullBooleanFIEld       类似 BooleanFIEld,不过允许 NulL 作为其中一个选项. 推荐使用这个字段而不要用 BooleanFIEld 加 null=True 选项       admin 用一个选择框 <select> (三个可选择的值: "UnkNown","Yes""No" ) 来表示这种字段数据. <14> SlugFIEld       "Slug" 是一个报纸术语. slug 是某个东西的小小标记(短签),只包含字母,数字,下划线和连字符.#它们通常用于URLs       若你使用 Django 开发版本,你可以指定 maxlength. 若 maxlength 未指定,Django 会使用默认长度: 50.  #在       以前的 Django 版本,没有任何办法改变50 这个长度.       这暗示了 db_index=True.       它接受一个额外的参数: prepopulate_from,which is a List of fIElds from which to auto-#populate       the slug,via JavaScript,in the objects admin form: models.SlugFIEld       (prepopulate_from=("pre_name","name"))prepopulate_from 不接受 DateTimeFIElds. <13> XMLFIEld        一个校验值是否为合法XML的 TextFIEld,必须提供参数: schema_path,它是一个用来校验文本的 RelaxNG schema #的文件系统路径. <14> filePathFIEld        可选项目为某个特定目录下的文件名. 支持三个特殊的参数,其中第一个是必须提供的.        参数    描述        path    必需参数. 一个目录的绝对文件系统路径. filePathFIEld 据此得到可选项目.        Example: "/home/images".        match    可选参数. 一个正则表达式,作为一个字符串,filePathFIEld 将使用它过滤文件名.         注意这个正则表达式只会应用到 base filename 而不是        路径全名. Example: "foo.*\.txt^",将匹配文件 foo23.txt 却不匹配 bar.txt 或 foo23.gif.        recursive可选参数.要么 True 要么 False. 默认值是 False. 是否包括 path 下面的全部子目录.        这三个参数可以同时使用.        match 仅应用于 base filename,而不是路径全名. 那么,这个例子:        filePathFIEld(path="/home/images",match="foo.*",recursive=True)        ...会匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif <15> IPAddressFIEld        一个字符串形式的 IP 地址,(i.e. "24.124.1.30").<16> CommaSeparatedIntegerFIEld        用于存放逗号分隔的整数值. 类似 CharFIEld,必须要有maxlength参数. 
2、setting设置

  若想将模型转为MysqL数据库中的表,需要在settings中配置:

DATABASES = {    default: {        ENGINE: django.db.backends.MysqL,name:bms,      # 要连接的数据库,连接前需要创建好        USER:root,        # 连接数据库的用户名        PASSWORD:‘‘,        # 连接数据库的密码        HOST:127.0.0.1,# 连接主机,默认本级        PORT:3306            #  端口 默认3306    }}

  在init.py文件中导入pyMysqL

import pyMysqLpyMysqL.install_as_MysqLdb()

  最后通过两条数据库迁移命令即可在指定的数据库中创建表 :

python manage.py makemigrationspython manage.py migrate

  如果想打印ORM执行的SQL语句,需要进行如下配置:

LOGGING = {    version: 1,disable_existing_loggers: False,handlers: {        console:{            level:DEBUG,class:logging.StreamHandler,},loggers: {        django.db.backends: {            handlers: [console],propagate: True,level:DEBUG,}}  
(2)添加表记录

  有两种方法:

  (1)方式一:

book_obj=Book(Title="python葵花宝典",state=True,price=100,publish="苹果出版社",pub_date="2012-12-12")book_obj.save()

  (2)方式二:

book_obj=Book.objects.create(Title="python葵花宝典",pub_date="2012-12-12")

  推荐使用方式二,create中包括了.save()方法。

(3)查询表记录

  基本格式为:类名.object.方法(参数)

  下面是一些常用的方法。

<1> all():                  查询所有结果  <2> filter(**kwargs):       它包含了与所给筛选条件相匹配的对象  <3> get(**kwargs):          返回与所给筛选条件相匹配的对象,返回结果有且只有一个,                            如果符合筛选条件的对象超过一个或者没有都会抛出错误。  <4> exclude(**kwargs):      它包含了与所给筛选条件不匹配的对象 <5> order_by(*fIEld):       对查询结果排序  <6> reverse():              对查询结果反向排序  <8> count():                返回数据库中匹配查询(querySet)的对象数量。  <9> first():                返回第一条记录  <10> last():                返回最后一条记录  <11> exists():              如果querySet包含数据,就返回True,否则返回False <12> values(*fIEld):        返回一个ValuequerySet——一个特殊的querySet,运行后得到的并不是一系列                            model的实例化对象,而是一个可迭代的字典序列<13> values_List(*fIEld):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 <14> distinct():            从返回结果中剔除重复纪录

  基于双下划线的模糊查询:

Book.objects.filter(price__in=[100,200,300])Book.objects.filter(price__gt=100)Book.objects.filter(price__lt=100)Book.objects.filter(price__range=[100,200])Book.objects.filter(Title__contains="python")Book.objects.filter(Title__icontains="python")Book.objects.filter(Title__startswith="py")Book.objects.filter(pub_date__year=2012)
(4)删除表记录

  删除方法就是 delete()。它运行时立即删除对象而不返回任何值。例如:

model_obj.delete()

  你也可以一次性删除多个对象。每个 querySet 都有一个 delete() 方法,它一次性删除 querySet 中所有的对象。

  例如,下面的代码将删除 pub_date 是2005年的 Entry 对象:(先查询再删除)

Entry.objects.filter(pub_date__year=2005).delete()
总结

以上是内存溢出为你收集整理的django--ORM全部内容,希望文章能够帮你解决django--ORM所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1190996.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存