Django学习小记(四)-----数据库ORM(单表操作)

一、基本介绍

Django 对各种数据库管理系统提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle

  • ORM:对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换
    在这里插入图片描述
  • 优点:可以实现不同类型数据库之间无缝切换,不需要改ORM语句

二、初始化设置

2.1 SQLite

  • 初始化:默认即为此,无需设置
  • 特点:一个文件即为一个数据库(在命令python manage.py migrate后产生)
  • 优点:简单易用,手机app常用此作为软件数据库
  • 缺点:处理并发请求性能较低,建议单机测试时用,服务器部署时采用MYSQL

2.2 MYSQL

2.2.1 数据库基础设置

  • 创建数据库(两种方法)
    • 命令行客户端:进入mysql,输入create database django_db default charset=utf8; # 防止编码问题,指定为 utf8
    • 可视化客户端:右键单击root@localhost创建数据库django_db,指定编码charset=utf8
  • 文件settings.py设置
    DATABASES = { 									# 修改默认数据库相关配置
    	   'default': 
    	   { 
    	       'ENGINE': 'django.db.backends.mysql',# 数据库引擎
    	       'NAME': 'django_db', 				# 数据库名称
    	       'HOST': '127.0.0.1', 				# 数据库域名,默认可不写
    	       'PORT': 3306, 						# 数据库端口,默认可不写
    	       'USER': 'root',  					# 数据库用户名
    	       'PASSWORD': '123456', 				# 数据库密码(只要不对外开放ip,密码任意)
    	   }  
    }
    

2.2.2 pymysql设置

功能:连接数据库与Django的媒介

  • 安装:终端输入命令pip install pymysql
  • 文件__init__.py设置(settings.py同级目录
    import pymysql
    	
    pymysql.install_as_MySQLdb()
    

三、数据库操作

3.1 数据库

在这里插入图片描述

  • 数据库管理系统:MySQL、SQLite等,一个管理系统可以统一管理多个数据库
  • 数据库:多个同项目的表组成一个数据库,例如:一个django porject项目就一个数据库
    • 表名:User、UserInfo,由api/models.py中的class行创建
    • 列属性:id、user,列名及列属性由api/models.py中的类体创建
    • 数据:1、2、jane、smith,由api/views.py中语句进行增删改查操作

3.2 api/models.py文件

3.2.1 基本信息

  • 文件功能:创建表、设定列属性

  • 列写法:属性=models.字段类型(选项)

  • 代码示例

    from django.db import models	# 默认就有
    
    # 必须继承models.Model,生成表并设表名User
    class User(models.Model):	
    	# 设列名user,字段类型Charfield,参数:最大长度32
        user = models.CharField(max_length=32, unique=True)	
        # 表的补充属性填写
        class Meta:
        	# 联合唯一索引
            unique_together = ('id', 'name')
            # 排序字段
            ordering = ['name']
    
    	# 语句:print(User的object对象),会调用此语句,参见3.3.1
        def __str__(self):
            return '%d-%s' % (self.id, self.name)
    

联合唯一索引:当有多列时,取不少于两列组成联合唯一索引,即 即使其他列不同,联合唯一索引也不可相同

idnameagegender
1sam121
2duke132
3jack121

注:如果取age列和gender列为联合唯一索引,则输入jack这行时报错,因为(age,gender)这个元组不可相同

3.2.2 参数说明

  • 字段列表

    字段类型说明(含参数)
    AutoField自动增长的IntegerField,默认Django会自动创建一个id列作为主键
    CharField字符串,参数max_length表示可容纳最多字符个数,≤255个
    TextField多字符串,无容量限制
    IntegerField整数,建议最小范围原则
    integer_field_ranges = {
      ‘SmallIntegerField’: (-32768, 32767),
      ‘IntegerField’: (-2147483648, 2147483647),
      ‘BigIntegerField’: (-9223372036854775808, 9223372036854775807),
      ‘PositiveSmallIntegerField’: (0, 32767),
      ‘PositiveIntegerField’: (0, 2147483647),
    }
    DecimalField十进制浮点数, 参数max_digits表示总位数, 参数decimal_places表示小数位数
    BooleanField值为True或False
    DateField日期,
    (1)参数auto_now:每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为False;
    (2)参数auto_now_add:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为False;
    (3)参数auto_now_add和auto_now是相互排斥的,组合将会发生错误
    TimeField时间,参数同DateField
    DateTimeField日期+时间,参数同DateField
  • 通用参数

    参数可选值
    default设置默认值,字符串注意引号
    null是否可为空,默认False,可为True
    blank是否可为空白,默认False,可为True
    primary_key是否主键字段,默认值是False,可为True,一般作为AutoField的选项使用
    unique如果为True, 这个字段在表中必须有唯一值,默认值是False

3.3 api/views.py文件

3.3.1 基本信息

  • 数据类型
    • int类型
      • 定义:返回为被影响的行数
      • 返回值为此类型函数: 修改update,删除delete
    • object类型
      • 定义:表中每一行即为一个object类型
      • 返回值为此类型函数:查询first、last,创建create
    • QuerySet类型
      • 定义:表中多行即为QuerySet类型,类似含有多个object类型数据的列表
      • 返回值为此类型函数:查询all,filter
  • 取值方法
    • 已知QuerySet求object:若a为QuerySet,a[0]为object
    • 已知object求列值:若a为User表的object对象,则user值为a.user

3.3.2 实操示例代码

  • postman中请求
    在这里插入图片描述

  • api应用中views.py(CBV写法

    from django.shortcuts import HttpResponse, redirect
    from django.views import View
    from api import models
    
    
    class Index(View):
        def get(self, request):
            return HttpResponse('GET处理结束')
    
        def post(self, request):
        
            # 获取请求体中的数据项
            user_a = request.POST.get('user_a')
            print('请求中user_a为:', user_a)
            user_b = request.POST.get('user_b')
            print('请求中user_b为:', user_b)
    
            # 数据库的增操作
            models.User.objects.create(id=1, user=user_a)
            models.User.objects.create(pk=2, user=user_b)  				# 主键,此处pk和id一样
    
            # 数据库的查询操作
            user_1 = models.User.objects.first().user
            print('查找数据库首行的用户项为:', user_1)
            user_2 = models.User.objects.filter(id=2).first().user
            print('查找数据库id=2行的用户项为:', user_2)
    
            # 数据库的改操作
            num = models.User.objects.filter(id=1).update(user='sam')	# update只能修改queryset数据类型
            print('筛选式修改操作所影响到的行数为:', num)
            user_3 = models.User.objects.first().user       			# 查询修改操作后的数据项
            print('修改操作后数据库首行的用户项为:', user_3)
    
            # 数据库的删操作
            res = models.User.objects.first().delete()					# delete方法可接收object对象或queryset对象
            #res的值元组:(1, {'api.User': 1}),前后两个1都代表影响到的行数
            user_4 = models.User.objects.first().user
            print('删除操作后数据库首行的用户项为:', user_4)
    
            # 格式化数据库内数据的操作
            models.User.objects.all().delete()
            print('数据库清空')
    
            return HttpResponse('POST处理结束')
    
  • 输出结果
    在这里插入图片描述

四、数据库可视化

4.1 各文件布局

  • 模型文件api/models.py
    from django.db import models
    from datetime import datetime
    
    
    class Stu(models.Model):
        birthday = models.DateField()
        height = models.DecimalField(max_digits=4, decimal_places=1)
        gender = models.IntegerField()
    

    记得第一时间做数据库迁移:migrate

  • 管理模块api/admin.py
    from django.contrib import admin
    from .models import Stu
    
    class StuPostAdmin(admin.ModelAdmin):
    	# 数组变量名是固定的:记录名称,不写不展示
        list_display = ["birthday", "height", "gender"]
    
    # 在管理界面注册数据库和admin模型组件
    admin.site.register(Stu, StuPostAdmin)
    
  • 路由配置main/urls.py
    ...
    from django.urls import path
    # admin数据库管理
    from django.contrib import admin
    
    urlpatterns = [
        path('admin/', admin.site.urls)
    ]
    ...
    

4.2 账号及登录

  • 创建超级用户:python manage.py createsuperuser
  • 登录页面:http://127.0.0.1:8000/admin
  • 弹出登录页面
    在这里插入图片描述

4.3 展示效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值