四、Django的ORM语句——一

1、ORM简介

1、ORM全称:Object Relation Mapping(对象关系映射)
2、ORM:让python中的类和对象与sql建立映射,其中,类映射一张表,对象映射一个记录;并且ORM不能自己建立数据库,须要在settings.py文件中配置数据库和相应的引擎(紧接着会说)
3、在修改数据库管理系统时,只需要在全局应用中将(例如:将mysql的ORM引擎换为Oricle引擎)以前的引擎换为相应的引擎即可
4、ORM的映射:
类---------------------表
类对象------------------表记录
类属性------------------表属性

2、设置数据库引擎(这里以mysql的引擎为例)

1、进入到settings.py文件中,删掉原来的DATABASES字典,然后添加如下字典

DATABASES = {
    'default':{
        'ENGINE' : 'django.db.backends.mysql',#配置数据库引擎
        'NAME' : 'dbname',    #要连接的数据库
        'USER' : 'root',   #连接数据库的用户名
        'PASSWORD' : 'password',  #连接数据库密码
        'HOST' : '127.0.0.1',   #连接的主机,默认本机
        'PORT' : '3306', #端口号
        }
    }

2、进入到项目的初始化文件,即__init__.py文件中,输入以下代码:

import pymysql 
pymysql.install_as_MySQLdb()

注: 此句的意思是引入pymysql,以此替换默认的MySQLdb。
做完以上步骤后,就可以在Django中利用ORM语言在mysql中创建表格和对表格进行各种操作了;而这也是Django的一个优点,即在不改变原有代码的情况下,只需要修改相应的数据库引擎,就可以将数据表等迁移至任何数据库中,这一点在数据迁移中很有用;下面开始进行正式的ORM语句创建表等操作了。

3、ORM语言的单表操作(默认已设置好各项配置)

ORM创建单表

首先,需要说明的是,在Django中,所有的创建数据库的ORM语句都会放在各个应用下的models.py文件中,也就是说此文件用于存放各个表的结构。
1、 用PyCharm创建一个Django项目,命名为“ORMLanguage”,并添加一个应用,命名为“ORMApplication”;按照下面页面中的步骤操作即可。
在这里插入图片描述
2、 打开项目应用“ORMApplication”下的models.py文件,输入以下代码

from django.db import models
class Book(models.Model): #此处必须继承models.Model,否则只是一般的python类
        nid = models.AutoField(primary_key=True) #创建一个主键(且自增)
        title = models.CharField(max_length=32) #创建一个书籍名称属性,其名称最大长度为32
        price = models.DecimalField(max_digits=8,decimal_places=2)#设置书籍的价格,最大长度为8(数字位数),其中有两位为浮点数(即小数部分)
        publish = models.CharField(max_length=32)#创建一个书籍出版社属性,最大长度为32位
        pub_date = models.DateTimeField() #存放格式必须是"2012-12-12"

以上代码表示在settings.py文件中设置的数据里创建一个名为book的表格,其具体信息已在注释中说明。
3、 打开命令行,进入到该项目的文件夹内,输入以下命令python manage.py makemigrations
执行此命令后,对于各种报错情况的处理:

  1. 报错内容为django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.,处理方法为: 进入到:PYthonJDK\lib\site-packages\django\db\backends\mysql"(lib前面的指的是Python解释器安装的位置,进入到python解释器安装的目录后,然后进入到lib目录下按照上面的寻找相应文件即可)文件夹中的base.py文件中,注释掉以下两行代码:
        if version < (1, 3, 3):
            raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)    
  1. 报错内容为AttributeError: 'str' object has no attribute 'decode',这个错误出现的原因是根据错误信息提示,说明 if 语句执行时出错, query 是 str 类型,而 decode() 是用来将 bytes 转换成 string 类型用的,(关于Python编码点这里),由于 query 不需要解码,所以直接将 if 语句注释掉就可以了; 解决方法为进入到PYthonJDK\lib\site-packages\django\db\backends\mysql目录下(这个目录同上,最前面的是python解释器安装的目录)的operations.py文件中,注释掉以下两行代码(以下函数中的if代码块),如下:
    def last_executed_query(self, cursor, sql, params):
                # With MySQLdb, cursor objects have an (undocumented) "_executed"
                # attribute where the exact query sent to the database is saved.
                # See MySQLdb/cursors.py in the source distribution.
                query = getattr(cursor, '_executed', None)
                # if query is not None:
                #     query = query.decode(errors='replace')
                return query

上一步成功的标识为:Migrations for 'app01': app01\migrations\0001_initial.py - Create model Book
这句话的意思为:现在的app01(名为ORM的Django项目中)应用中有一个migrations文件夹,文件夹中包含了两个.py文件,分别为:(0001_initial.py)和(init.py)文件,其中0001_initial.py文件记录了models.py文件的更新。
4、 上一步成功后,继续在终端中执行此命令:执行此命令:python manage.py migrate,会在配置的数据库中生成相应的表格,如果没有生成,参看最后的注意事项。
至此,创建操作完成。
总结:

  1. 以上两个命令就是数据迁移(3和4两步的命令),Django会把settings.py文件中的INSTALLED_APPS中每一个应用中models对应类创建成数据库中的表
  2. 在数据迁移的过程中,每个表必须有一个主键,若不指定主键,则会默认创建一个id属性作为主键
向表中添加数据

1、 在urls.py文件中添加相应的路由和视图函数(视图函数名字为addbook),具体如下:

from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('books/add/',views.addbook), #新添加的路由和视图函数,名字是自己定义的
]

2、 在views.py中,实现该响应函数,具体代码 如下:

from app01.models import Book#只有引入创建表格的那个类,才能在下面的函数中使用
   #添加表记录
    def addbook(request):
        #添加表记录
        book = Book(title='python',price=123,pub_date='2012-10-10',publish='机械工业出版社')
        book.save()#此句至关重要,这句加上才能将上面的记录添加到数据库中
        return HttpResponse(book)

附: 在上面的添加方法中,用的是实例化一个类来做的(实例化了Book类),除此之外,还可以使用object类自带的create方法添加,其不用最后用save提交,会自动提交到数据库,并且会将创建的对象返回,具体示例如下:

book = Book.objects.create(title='linux',price=79,pub_date='2012-9-10',publish='工业出版社')

然后用浏览器访问上述添加的路径看是否返回了book对象,如果返回,则说明添加成功,前往数据库中的book表中查看是否有相应数据,有则表示添加成功。

查询表中的数据

下面开始介绍常用的ORM查询语句;首先,这些语句返回的结果都是Queryset类型,有点类似于一个列表中放了若干对象,比如[obj,obj,…,obj]。下面来看具体示例:
1、 类名.objects.all()
表示查询一个表中的所有记录,并且以Queryset的形式返回;如Book.objects.all()
2、 类名.objects.filter(条件)
查询类名所表示的表中满足指定条件的记录,如Book.objects.filter(nid=delete_book_id)查询指定id的记录

更新一个表中某条记录

更新的函数是update()函数,具体的语句为类名.objects.filter(条件).update(要更新的字段名=新的值);这句话的意思是从表中查找出满足条件的记录然后将指定字段更新为新的值,由于filter()返回的是Queryset对象,所以可以直接调用update()函数。
实例:Book.objects.filter(nid=edit_book_id).update(price=100);查找到nid为edit_book_id的记录将其价格price更新为100
如果是要删除某条记录,将上面的update换为delete即可,语法为:类名.objects.filter(条件).delete()
注: update()方法只能在filter()方法后面用。

附:注意!

只有注册在(settings.py)文件夹中的INSTALLED_APPS列表中的内容(项目)才可以生成数据表格,即名为INSTALLED_APPS列表,这点一定要注意,注册方法在代码块中介绍,如下:

INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01.apps.App01Config', #只有在此注册的应用才可以使用命令创建数据库表格(ORM才可以生效)/此处的意思为:app01应用下的apps.py文件中的App01Config类,此类中有一个属性:name="app01"
    ]

另外,在settings.py文件中输入以下内容(即可将日志中的sql语句打印到控制台,即将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',
            },
        }
    }
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值