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',
]
原文地址:https://www.cnblogs.com/stone1989/p/11171721.html