Django模型

作者: Lydia1991 | 来源:发表于2020-06-18 15:00 被阅读0次

    Django对各种据库提供了很好的支持,包括:PostgreSQL, MySQL, SQLite, Oracle。
    Django未这些数据库提供了统一的调用API。我们可以根据自己业务需求选择不同的数据库。
    MySQL是Web应用中最常用的数据库,我们将以Mysql作为是开进行介绍。
    如果你没安装mysql驱动,可以执行以下命令安装:

    sudo pip install pymysql

    Collecting pymysql
      Downloading https://files.pythonhosted.org/packages/ed/39/15045ae46f2a123019aa968dfcba0396c161c20f855f11dea6796bcaae95/PyMySQL-0.9.3-py2.py3-none-any.whl (47kB)
        100% |████████████████████████████████| 51kB 57kB/s 
    Installing collected packages: pymysql
    Successfully installed pymysql-0.9.3
    (djangovenv) LydiadeMacBook-Pro:testLocalHost apple$ 
    
    

    Django ORM

    Django模型使用自带的ORM。
    对象关系映射(Object Relational Mapping, 简称ORM)用于实现面向对象编程语言里不同类型系统的数据之间的转换。
    ORM在业务逻辑层和数据库层之间充当了桥梁的作用。
    ORMORM是通过描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。

    使用ORM的好处:

    • 提高开发效率。
    • 不同数据库可以平滑切换

    使用ORM的缺点:

    • ORM转换为SQL语句时,需要花费一定的时间,执行效率会有所降低。
    • 长期写ORM代码,会降低编写SQL语句的能力。

    ORM解析过程:

    1、 ORM会将Python代码转成SQL语句。
    2、SQL语句通过pymysql传送到数据库服务端。
    3、在数据库中执行SQL语句并将结果返回。

    ORM关系对应表:


    数据库配置

    Django 如何使用 mysql 数据库
    MAC下载mysql地址:https://dev.mysql.com/downloads/mysql/
    ORM无法操作到数据级别,只能操作到数据库表。
    创建MySQL 数据库语法,数据库名称为 database

    create database runoob default charset=utf8;

    我们在项目的settings.py文件中找到DATABASE配置项,将其信息修改为:

    testLocalHost/testLocalHost/settings.py 文件代码:

    DATABASES = { 
        'default': 
        { 
            'ENGINE': 'django.db.backends.mysql',    # 数据库引擎
            'NAME': 'runoob', # 数据库名称
            'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1 
            'PORT': 3306, # 端口 
            'USER': 'root',  # 数据库用户名
            'PASSWORD': '123456', # 数据库密码
        }  
    }
    
    

    上面包含数据库名称和用户的信息,它们与MySQL中对应数据库和用户的设置相同。Django根据这一设置,与MySQL中相应的数据库和用户连接起来。
    接下来,告诉Django 使用 pymysql 模块连接 mysql 数据库:
    实例:

    # 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
    import pymysql
    
    pymysql.install_as_MySQLdb()
    

    定义模型

    创建APP
    Django 规定,如果要使用模型,必须要创建一个app。我们使用以下命令创建一个TestModel 的app:
    django-admin.py startapp TestModel
    目录结构如下:

    testLocalHost
    |-- HelloWorld
    |-- manage.py
    ...
    |-- TestModel
    |   |-- __init__.py
    |   |-- admin.py
    |   |-- models.py
    |   |-- tests.py
    |   `-- views.py
    

    修改TestModel/models.py 文件,代码如下:

    # testLocalHost/TestModel/models.py文件代码:
    
    from django.db import models
     
    class Test(models.Model):
        name = models.CharField(max_length=20)
    

    以上的类名代表了数据库表名,且继承了models.Model,类里面的字段代表数据表中的字段(name),数据类型则由CharField(相当于varchar)、DateField(相当于datetime),max_length 参数限定长度。
    接下来在 settings.py 中找到INSTALLED_APPS这一项,如下:

    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'TestModel',               # 添加此项
    )
    

    在命令行中运行:

    $ python manage.py migrate   # 创建表结构
    
    (djangovenv) LydiadeMacBook-Pro:testLocalHost apple$ python manage.py migrate
    Operations to perform:
      Apply all migrations: admin, auth, contenttypes, sessions
    Running migrations:
      Applying contenttypes.0001_initial... OK
      Applying auth.0001_initial... OK
      Applying admin.0001_initial... OK
      Applying admin.0002_logentry_remove_auto_add... OK
      Applying admin.0003_logentry_add_action_flag_choices... OK
      Applying contenttypes.0002_remove_content_type_name... OK
      Applying auth.0002_alter_permission_name_max_length... OK
      Applying auth.0003_alter_user_email_max_length... OK
      Applying auth.0004_alter_user_username_opts... OK
      Applying auth.0005_alter_user_last_login_null... OK
      Applying auth.0006_require_contenttypes_0002... OK
      Applying auth.0007_alter_validators_add_error_messages... OK
      Applying auth.0008_alter_user_username_max_length... OK
      Applying auth.0009_alter_user_last_name_max_length... OK
      Applying auth.0010_alter_group_name_max_length... OK
      Applying auth.0011_update_proxy_permissions... OK
      Applying sessions.0001_initial... OK
    (djangovenv) LydiadeMacBook-Pro:testLocalHost apple$ 
    

    $ python manage.py make migrations TestModel # 让 Django 知道我们在我们的模型有一些变更

    (djangovenv) LydiadeMacBook-Pro:testLocalHost apple$ python manage.py make migrations TestModel
    Migrations for 'TestModel':
      TestModel/migrations/0001_initial.py
        - Create model Test
    

    $ python manage.py migrate TestModel # 创建表结构

    (djangovenv) LydiadeMacBook-Pro:testLocalHost apple$ python manage.py migrate TestModel
    Operations to perform:
      Apply all migrations: TestModel
    Running migrations:
      Applying TestModel.0001_initial... OK
    
    

    常见报错信息
    如果执行以上命令时出现以下报错信息:

    原因是 MySQLclient 目前只支持到 Python3.4,因此如果使用的更高版本的 python,需要修改如下:

    if version < (1, 3, 13):
        raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
    

    一般点报错的代码文件路径信息,会自动跳转到报错文件中行数,通过报错信息的文件路径找到 ...site-packages\Django-2.0-py3.6.egg\django\db\backends\mysql 这个路径里的 base.py 文件,此时把报错的代码行数注释掉(代码在文件开头部分)。


    数据库操作

    在 testLocalHost 目录中添加 testdb.py 文件,并修改 urls.py:

    # testLocalHost/testLocalHost.py文件代码
    from django.urls import path
     
    from . import views,testdb
     
    urlpatterns = [
        path('runoob/', views.runoob),
        path('testdb/', testdb.testdb),
    ]
    
    

    添加数据

    添加数据需要先创建对象,然后再执行 save 函数,相当于SQL中的INSERT:

    # testLocalHost/testLocalHost/testdb.py 文件代码
    
    # -*- coding: utf-8 -*-
     
    from django.http import HttpResponse
     
    from TestModel.models import Test
     
    # 数据库操作
    def testdb(request):
        test1 = Test(name='runoob')
        test1.save()
        return HttpResponse("<p>数据添加成功!</p>")
    

    访问 http://127.0.0.1:8000/testdb 就可以看到数据添加成功的提示。结果如下:

    相关文章

      网友评论

        本文标题:Django模型

        本文链接:https://www.haomeiwen.com/subject/lrxsxktx.html