zoukankan      html  css  js  c++  java
  • Django2.2框架:ORM数据库操作

    Django框架:ORM数据库操作

    1、ORM介绍

    映射关系:

      表名 --------------------》类名

      字段--------------------》属性

      表记录-----------------》类实例化对象

    ORM的两大功能:

      操作表:

        - 创建表

        - 修改表

        - 删除表

      操作数据行:

        - 增删改查

    ORM利用pymysql第三方工具链接数据库

    Django没办法帮我们创建数据库,只能我们创建完之后告诉它,让django去链接

    2、创建表之前的准备工作

    一、自己创建数据库

    二、在settings里面配置mysql数据库链接

      sqlite3------改为mysql

    # 修改django默认的数据库的sqlite3为mysql
    DATABASES = {
        'default': {
                'ENGINE': 'django.db.backends.mysql', #通过这个去链接mysql
                'NAME': 'djangotsgl',
                'USER':'root',
                'PASSWORD':'123456',
                'HOST':'localhost',
                'PORT':'3306',
            }
        }            
    
    STATIC_URL = '/static/'
    STATICFILES_DIRS = (
        os.path.join(BASE_DIR, 'static/'),
    )
    

      这样写上以后django会默认的就去链接数据库

    3、工程目录中的--init--文件

    import pymysql
    pymysql.install_as_MySQLdb()
    

    4、创建数据库表

    models.py

    class Book(models.Model):  #必须要继承的
        nid = models.AutoField(primary_key=True)  #自增id(可以不写,默认会有自增id)
        title = models.CharField(max_length=32)
        publishDdata = models.DateField()  #出版日期
        author = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=5,decimal_places=2)  #一共5位,保留两位小数
    

    执行命令创建:(需要记住的!!!) 

    python3 manage.py makemigrations   创建脚本
    python3 manage.py migrate   迁移
    

    具体例子实现

    model.py
    Alt text

    urls.py
    Alt text

    views.py

    from  polls.models import Book
    def data_oper(request):
        obj=Book(
            title="周测试",
            price=199,
            publishDdata="2019-05-26",
            author="stone",
        )
        obj.save()
    
        return HttpResponse("Hello world")
    

    template /index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width">
        <title>Title</title>
        <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
        <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
        <style>
            table{
                margin-top: 50px;
            }
        </style>
    </head>
    <body>
    <div class="containers">
        <div class="row">
            <div class="col-md-9 col-md-offset-2">
                <table class="table table-hover">
                    <thead>
                        <tr>
                            <th>编号</th>
                            <th>书名</th>
                            <th>出版日期</th>
                            <th>作者</th>
                            <th>价钱</th>
                            <th>操作</th>
                        </tr>
                    </thead>
                    <tbody>
                    {% for book in book_list %}
                        <tr>
                                <td>{{ book.nid }}</td>
                                <td>{{ book.title }}</td>
                                <td>{{ book.publishDdata|date:'Y-m-d' }}</td>
                                <td>{{ book.author }}</td>
                                <td>{{ book.price }}</td>
                                <td>
                                    <a href="/del/{{ book.nid }}"><button class="btn btn-danger">删除</button></a>
                                    <a href="/edit/{{ book.nid }}"><button class="btn btn-success">编辑</button></a>
                                    <a href="/add/"><button class="btn btn-primary">添加</button></a>
                                </td>
                        </tr>
                    {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>
    </div>
    </body>
    </html>
    

    图片内容具体,
    Alt text

    5、查看数据库的sql语句(加在settings.py)

    查看数据库执行代码
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console':{
                'level':'DEBUG',
                'class':'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level':'DEBUG',
            },
        }
    }
    

    6、遇到的问题

    6.1、Django - installing mysqlclient error: mysqlclient 1.3.13 or newer is required; you have 0.9.3

    解决方法:

    cd 项目路径下:venv/lib/python3.7/site-packages/django/db/backends/mysql
    vim base.py
    
    if version < (1, 3, 13):
        pass
    """
        raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
    
    """
    

    6.2、Django2.2报错——AttributeError: ''str'' object has no attribute ''decode''

    Django2.2报错–AttributeError: ‘str’ object has no attribute 'decode’的解决方案,仅算是临时解决,所有更好的解决方案应该斟酌使用本方法

    解决方法:

    文件位置:项目路径:venv/lib/python3.7/site-packages/django/db/backends/mysql
    文件名:operations.py
    修改方法:注释145 146 代码

        query = getattr(cursor, '_executed', None)
       # if query is not None:
       #     query = query.decode(errors='replace')
        return query
    

    6.3 Django2.2 MySQL Strict Mode is not set for database connection 'default'

    解决方法:

    修改文件:settings.py
    修改内容:

    DATABASES = {
        # 'default': {
        #     'ENGINE': 'django.db.backends.sqlite3',
        #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        # }
        'default': {
            'ENGINE': 'django.db.backends.mysql',  # 通过这个去链接mysql
            'NAME': 'test_db',
            'USER': 'test',
            'PASSWORD': 'passwd',
            'HOST': 'localhost',
            'PORT': '3306',
            'OPTIONS': {
                "init_command": "SET sql_mode='STRICT_TRANS_TABLES'"
            },
        }
    }
    

    6.4、执行python manage.py makemigrations和python manage.py migrate表没有创建,原因之一:

    项目路径setting文件,未添加新建项目名:

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'polls',
    ]
  • 相关阅读:
    66. Plus One
    Binder
    Activity启动模式笔记整理
    ANR和FC
    java之yield(),sleep(),wait()区别详解-备忘笔记
    Http方法:Get请求与Post请求的区别
    BroadcastReceiver的用法笔记
    java笔记
    Leetcode -- Day 17 & Day 18 & Day 19
    Leetcode -- Day 14&Day15&Day16&Day17
  • 原文地址:https://www.cnblogs.com/stone1989/p/11171721.html
Copyright © 2011-2022 走看看