django-orm基本使用
1007字约3分钟
2024-09-29
了解静态网站与动态网站
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)