django 模型设置与简单应用-ORM

1、django 模型设置与简单应用

Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。 Django 为这些数据库提供了统一的调用 API。 我们可以根据自己业务需求选择不同的数据库。

MySQL 是 Web 应用中最常用的数据库。如果你没安装 mysql 驱动,可以使用如下命令安装。

pip install pymysql

Django ORM

Django 模型使用自带的 ORM。

对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的 数据之间的转换。

ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。

ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。

使用 ORM 的好处:

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

使用 ORM 的缺点:

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

ORM 解析过程:

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

ORM 对应关系表:

1)数据库配置

首先创建一个app应用

django-admin manage.py startapp timeInfo

创建 MySQL 数据库( ORM 无法操作到数据库级别,只能操作到数据表)语法:

 create database 数据库名称 default charset=utf8; # 防止编码问题,指定为 utf8 

例如 创建一个名为 runoob 数据库,编码指定为 utf8:

 create database runoob default charset=utf8; 

settings.py: 文件代码修改:

代码

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

上面包含数据库名称和用户的信息,它们与 MySQL 中对应数据库和用户的设置相同。Django 根据这一 设置,与 MySQL 中相应的数据库和用户连接起来。

接下来,告诉 Django 使用 pymysql 模块连接 mysql 数据库:

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

import pymysql
pymysql.install_as_MySQLdb()

修改 TestModel/models.py 文件

代码如下

from django.db import models

# Create your models here.
class Events(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=255)
    pubDate = models.BigIntegerField()
    sourceUrl = models.CharField(max_length=255)

在命令行中运行:

$ python3 manage.py makemigrations TestModel # 让 Django 记录模型的改变,生产对应的 sql 语句

$ python3 manage.py migrate # 将所有的模型同步到数据库

$ python3 manage.py migrate TestModel #将特定的模型同步到数据库

看到几行 "Creating table…" Creating table…"Creating table…" 的字样,你的数据表就创建好了。

Creating tables ...

……

Creating table TestModel_test #我们自定义的表

……

数据库操作

接下来我们在项目目录中添加 testdb.py 文件(下面介绍),并修改 urls.py:

from django.urls import path
from . import views,testdb
urlpatterns = [
path('runoob/', views.runoob),
path('testdb/', testdb.testdb),
]

完整代码

from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    context = {}
    context['weather'] = '下午出太阳'
    return render(request, 'index.html', context=context)

from timeInfo.models import Book
#增加
def insertbook(request):
    book = Book(id=1001, title="霸道总裁爱上python", price=999.89, publish="宇宙出版社", pubdate="2000-01-01")
    book.save()
    return HttpResponse("插入成功")

#查询
def searchbook(request):
    #1、查询多条数据
    # 通过 objects 这个模型管理器的 all()获得所有数据行,相当于 SQL 中的 SELECT * FROM
    booklist = Book.objects.all()
    bookinfo = []
    for i in booklist:
        bookinfo.append(i.id)
        bookinfo.append(i.title)
        bookinfo.append(i.price)
        bookinfo.append(i.publish)
        bookinfo.append(i.pubdate)
    print(bookinfo)

    #2、查询单条数据
    book = Book.objects.get()
    print(booklist.id,booklist.title,booklist.price,booklist.publish,booklist.pubdate)

    #3、查询指定条件数据
    # 获取单个对象
    book = Book.objects.get(id=1001)
    print(booklist.id, booklist.title, booklist.price, booklist.publish, booklist.pubdate)

    # 4、过滤filter 相当于 SQL 中的 WHERE,可设置条件过滤结果
    #过滤单条数据
    book = Book.objects.filter(id=1001)

    # 数据排序
    Book.objects.order_by('name')
    # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
    bookli = Book.objects.order_by('name')[0:2]
    # 连锁使用
    s = Book.objects.filter(id=1001).order_by('name')

    for i in bookli:
        bookinfo.append(i.id)
        bookinfo.append(i.title)
        bookinfo.append(i.price)
        bookinfo.append(i.publish)
        bookinfo.append(i.pubdate)
    print(bookinfo)
    return HttpResponse("查询成功")

#修改
def makebook(request):
    book = Book.objects.get(id=1001)
    book.title = "霸道总裁爱上linux"
    book.save()
    return HttpResponse("修改成功")

#删除
def deletebook(request):
    #1、删除一条
    book = Book.objects.get(title="霸道总裁爱上linux")
    # 删除 title="霸道总裁爱上linux" 的数据也可以写成 id=1001
    # 即book = Book.objects.get(id=1001)
    book.delete()

    #2、删除所有数据
    Book.objects.all().delete()

 

posted @ 2022-05-17 15:42  冬雪覆城,未必寒冷ゞ  阅读(65)  评论(0)    收藏  举报