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 migrate4、进入数据库查看表
生成表名的默认格式:应用名_模型类名小写
使用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=utf82、使用pip工具安装pymysql模块
pip install pymysql3、修改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 migrateORM增删改查
增:
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 createsuperuser3、注册模型
# 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)