Django ORM模型


参考视频:https://ke.qq.com/course/320021

一、ORM是什么

对象关系映射(Object Relational Mapping,ORM):是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。简单来说就是在编程语言中实现的一种虚拟对象数据库。

我们对虚拟对象数据库进行操作,它会转换成具体的SQL去操作数据库,这样就不需要学习复杂的SQL语句了。

ORM优势:不必熟悉复杂的SQL语句,容易上手,避免新手写SQL效率问题。

在这里插入图片描述

二、Model(模型类)

2.1.使用模型类定义一个User表,包含多字段

myapp/models.py:

from django.db import models

# 定义一个user表
class User(models.Model):
    user = models.CharField(max_length=30)  # 用户名,最大长度为30
    name = models.CharField(max_length=30)  # 名字
    sex = models.CharField(max_length=10)
    age = models.IntegerField()
    label = models.CharField(max_length=100)    #标签(备注)

2.2.在settings.py配置文件中INSTALLED_APPS列表添加APP名称

在这里插入图片描述

2.3.将模型类生成具体的数据库表

生成迁移文件

python manage.py makemigrations

在这里插入图片描述
在对应的路径可以查看python代码
在这里插入图片描述
执行迁移文件生成表

python manage.py migrate

在这里插入图片描述
Django默认使用的是db.sqlite3数据库,需要使用特定的工具才能看到里面的内容
在这里插入图片描述

三、使用MySQL数据库

3.1.Linux安装Mysql

3.2.进入到Mysql创建test库

mysql -uroot -h192.168.137.2 -p
create database test;

3.3.使用pip3工具安装pymysql模块

pip3 install pymysql

3.4.修改django默认连接数据库

devops/settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '192.168.137.2',
        'PORT': '3306',
    }
}

在这里插入图片描述

3.5.指定数据库驱动

myapp/_init_.py:

import pymysql
pymysql.install_as_MySQLdb()

3.6.启动项目

在这里插入图片描述

3.7.执行迁移文件生成表

python mange.py migrate

3.8.查看数据库会多了这些表

在这里插入图片描述

四、ORM增删改查

4.1.增

from myapp.models import User
def user_add(request):
	User.objects.create(
		user='aliang',
		name='阿良',
		sex='男',
		age='30',
		label="IT,讲师,老司机" )
return HttpResponse("用户添加成功!")

或者用save方法保存:

obj = User(
	user=user,
	name=name,
	sex=sex,
	age=age,
	label=label
)
obj.save()

4.2.删

User.objects.filter(id=3).delete()

4.3.改

User.objects.filter(user=‘amei’).update(age=27,label=‘公关,漂亮,喜欢购物’)

4.4.查

def user_list(request):
	user_list = User.objects.all()
return render(request, "user.html", {'user_list': user_list})

获取所有数据
User.objects.all()

加条件获取数据
User.objects.filter(user=‘amei’)
User.objects.filter(age__gt=28)

获取单条数据
User.objects.get(id=2)

五、内置管理后台

一个网站一般都会开发一个后台系统,为管理员提供一种更简单的数据库操作方式
在这里插入图片描述

5.1.访问URL

启动Django项目后默认开启后台管理系统

访问地址:http://127.0.0.1:8001/admin
在这里插入图片描述

5.2.创建管理员账号

python manage.py createsuperuser

在这里插入图片描述
使用用户名和密码登录
在这里插入图片描述

5.3.注册模型

myapp/admin.py

from django.contrib import admin
from myapp import models

admin.site.register(models.User)    # 注册user表到后台

重启项目
在这里插入图片描述

5.4.在后台界面对数据库进行增删改查

在这里插入图片描述
进来后会看到所有记录,我这只有一条
在这里插入图片描述
修改年龄,并保存
在这里插入图片描述
年龄已变为19
在这里插入图片描述

增加用户
在这里插入图片描述
在这里插入图片描述
多了一条记录
在这里插入图片描述
在这里插入图片描述
删除用户
在这里插入图片描述
在这里插入图片描述

5.5.设置中文和时区

devops/settings.py

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False

在这里插入图片描述
修改成功
在这里插入图片描述

六、模型中的Meta类与方法

Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性。

以下是该常用属性:
在这里插入图片描述

6.1.myapp/models.py

    class Meta:
        app_label = "myapp"     # 指定APP名称
        db_table = "user"       # 自定义生成的表名
        verbose_name_plural = "用户表"     # 对象的可读名称,不带复数s
        ordering = ["sex"]

    def __str__(self):
        return self.name    #当查询User表时,返回具体的字段,默认返回的是一个对象

在这里插入图片描述

6.2.数据迁移

python manage.py makemigrations
python manage.py migrate

表名已变为user
在这里插入图片描述
变成自定义名字
在这里插入图片描述
根据名字显示
在这里插入图片描述

七、模型类常用字段

在这里插入图片描述

八、模型类常用字段选项

在这里插入图片描述

九、QuerySet序列化

序列化:将Python对象转为传输的数据格式(通常是json)
反序列化:将传输的数据格式转为Python对象

ORM查询返回的是QuerySet对象,如果你要提供数据接口,这显然是不行的。

有两种方法可以转为JSON字符串:
• 使用内建函数 serializers
• 遍历QuerySet对象将字段拼接成字典,再通过json库编码

9.1.方法一

from django.core import serializers
obj = User.objects.all()
data = serializers.serialize('json', obj)

9.2.方法二,可以定义返回的内容

from django.http import JsonResponse
obj = User.objects.all()
d = {}
for i in obj:
    d['name'] = i.name
    d['user'] = i.user
    d['label'] = i.label
return JsonResponse(d)

9.3.示例:返回数据库的内容,以Json格式显示

myapp/urls.py添加

re_path('api/$', views.api)

myapp/views.py

from django.http import HttpResponse
from myapp.models import User
from django.core import serializers

def api(request):
    obj = User.objects.all()
    data = serializers.serialize('json', obj)	#把对象转换为Json
    return HttpResponse(data)

postman查看
在这里插入图片描述

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页