了解静态网站与动态网站

ORM 是什么

对象关系映射(Object Relational Mapping,ORM):是一种程序设计技术,用于实现面向对象编程语言 里不同类型系统的数据之间的转换。简单来说就是在编程语言中实现的一种虚拟对象数据库。我们对虚拟对象 数据库进行操作,它会转换成具体的SQL去操作数据库,这样一来我们就不需要学习复杂的SQL语句了。

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

Model(模型类)

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

# myapp/models.py
class User(models.Model):
user = models.CharField(max_length=30) # 用户名
name = models.CharField(max_length=30) # 姓名
sex = models.CharField(max_length=10) # 性别
age = models.IntegerField() # 年龄
label = models.CharField(max_length=100) # 标签

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

INSTALLED_APPS = [ 
#...
'myapp',
]

3、将模型类生成具体的数据库表

# 生成迁移文件 
python manage.py makemigrations
# 执行迁移文件生成表
python mange.py migrate

4、进入数据库查看表

生成表名的默认格式:应用名_模型类名小写

使用MySQL数据库

1、使用docker启动一个mysql实例

docker run -d \
--name db \
-p 3306:3306 \
-v mysqldata:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7 --character-set-server=utf8

2、使用pip工具安装pymysql模块

pip install pymysql

3、修改django默认连接数据库

# devops/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '192.168.1.11',
'PORT': '3306',
}
}

4、指定数据库驱动

# myapp/__init__.py
import pymysql
pymysql.install_as_MySQLdb()

5、执行迁移文件生成表

python mange.py migrate

ORM增删改查

增:

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

或者用save方法保存:
obj = User(
user=user,
name=name,
sex=sex,
age=age,
label=label
)
obj.save()

查:

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)

改:

User.objects.filter(user='amei').update(age=27,label='公关,漂亮,喜欢购物')
或者
obj = User.objects.get(user='amei')
obj.age = 25
obj.save()

删:

User.objects.filter(id=3).delete()
或者
obj = User.objects.get(id=2)
obj.delete()

Django内置管理后台

管理后台:一个网站一般都会开发一个后台系统,为管理员提供一种更简单的数据库操作方式。

1、访问URL

from django.contrib import admin # 内建管理后台功能
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls), # 内建管理后台访问地址
]

2、创建管理员账号

python manage.py createsuperuser

3、注册模型

# myapp/admin.py
from django.contrib import admin
from myapp import models
admin.site.register(models.User)

4、设置语言和时区

# devops/settings.py
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False

模型中的Meta类与方法

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

以下是该常用属性:

示例:模型类Meta与方法使用

class User(models.Model):
user = models.CharField(max_length=30)
name = models.CharField(max_length=30)
sex = models.CharField(max_length=30)
age = models.IntegerField()
label = models.CharField(max_length=100)

class Meta:
app_label = "myapp" # 指定APP名称
db_table = "myapp_user" # 自定义生成的表名
verbose_name = "用户表" # 对象的可读名称
verbose_name_plural = "用户表" # 名称复数形式
ordering = ["sex"] # 对象的默认顺序,用于获取对象列表时
def __str__(self):
return self.name # 返回字段值

模型类常用字段与选项

QuerySet对象序列化

序列化:将Python对象转为传输的数据格式,例如json

反序列化:将传输的数据格式转为Python对象

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

有两种方法可以转为JSON字符串:

  • 使用内建函数 serializers

  • 遍历QuerySet对象将字段拼接成字典,再通过json库编码

from django.core import serializers
obj = User.objects.all()
data = serializers.serialize('json', obj)
import json
obj = User.objects.all()
l = [] # [{},{}]
for i in obj:
d = {}
d['name'] = i.name
d['user'] = i.user
d['sex'] = i.sex
d['age'] = i.age
d['label'] = i.label
l.append(d)
json_data = json.dumps(l)