3

【Django之Django REST Framework框架安装+Django之ORM框架】

 1 year ago
source link: https://blog.51cto.com/u_15874356/5951599
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

【Django之Django REST Framework框架安装+Django之ORM框架】

推荐 原创

HI王小呆 2022-12-19 11:05:02 ©著作权

文章标签 字段名 字段 数据模型 文章分类 IT职场 其它 私藏项目实操分享 阅读数256

【Django之Django REST Framework框架安装】

  1. 它是在Django基础之上,进行了二次开发
  2. 主要用于构建Restful API
  3. 简称为DRF框架或者REST Framework框架
  • 提供了强大的Serializer序列化器,可以高效地进行序列化与反序列化操作
  • 提供了极为丰富的类视图、Mixin扩展类、Viewset视图集
  • 提供了直观的Web API界面
  • 多种身份认证和权限认证
  • 强大的排序、过滤、分页、搜索、限流等功能
  • 可扩展性强,插件丰富

三、安装&配置

直接使用pip安装即可

pip install -i https://pypi.douban.com/simple djangorestframework
pip install -i https://pypi.douban.com/simple markdown # Markdown support for the browsable API.

settings.py中将rest_framework字段添加到INSTALLED_APPS列表中即可

【Django之Django REST Framework框架安装+Django之ORM框架】_字段

====================================================================================================================================================================================================================================================================================================================================

接下来讲解:

【Django之ORM框架】

对象关系映射(Object Relational Mapping,简称ORM)模式的作用是在关系型数据库与业务实体对象之间进行映射
通过类和对象就能操作它所对应数据表中的数据(CRUD)

二、数据迁移

1.配置数据库连接信息

创建数据库

配置数据库:需要在全局settings.py中的DATABASES字段中配置数据库信息

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

安装mysqlclient

需要满足的依赖

# Debian/Ubuntu
sudo apt-get install python-dev default-libmysqlclient-dev
# Red Hat/CentOS
sudo yum install python-devel mysql-devel
# macOS (HomeBrew)
brew install mysql-client
pip install mysqlclient

2.在models.py中定义模型类

2.1、可以在子应用projects/models.py文件中定义数据模型
2.2、一个数据模型类对应一个数据表
2.3、数据模型类,需要继承Model父类或者Model子类
2.4、在数据模型中,添加的类属性(Field对象)来对应数据表中的字段

from django.db import models

class Projects(models.Model):
name = models.CharField(max_length=200)
age = models.CharField(max_length=50)
# 生成迁移脚本
python manage.py makemigrations
# 生成数据表
python manage.py migrate

terminal执行以上两条命令,则在数据库生成对应的表

上面生成迁移脚本和创建数据库表的命令行都是针对所有的,如果只想创建某一个子应用的表呢?只需要在上面的命令行后面跟上子应用名即可

# 生成指定应用的迁移脚本
python manage.py makemigrations 子应用名称
# 生成指定应用的数据表
python manage.py migrate
子应用名称

4、表的创建

在第二步的迁移步骤中,已经实现了如何通过数据模型创建数据库表,我们知道数据库表字段有各种属性,如长度、字符类型、约束条件、默认值等等,在Django的数据模型中,我们并不需要去编写sql语句来创建数据库表,而是可以通过类和对象的方式进行数据库的增删改查等操作,这样就方便了许多。

AutoField类、CharField类、IntegerField类、TextField类、DecimalField类、DateTimeField类、DateField类、TimeField类等等,它们都继承了Field父类,我们通过查看Field源码的构造方法,可以看到很多关于字段的属性设置

def __init__(self, verbose_name=None, name=None, primary_key=False,
max_length=None, unique=False, blank=False, null=False,
db_index=False, rel=None, default=NOT_PROVIDED, editable=True,
serialize=True, unique_for_date=None, unique_for_month=None,
unique_for_year=None, choices=None, help_text='', db_column=None,
db_tablespace=None, auto_created=False, validators=(),
error_messages=None):
  • verbose_name:个性化信息
  • primary_key:主键约束,如果某一个字段中设置了primary_key=True,那么Django就不会自动创建id字段
  • max_length:至少要指定一个该字段,它代表此字段的最大长度,不能为负数,最大长度不能超过200
  • unique:唯一键约束
  • blank:指定前端用户在创建数据时,是否需要传递,默认需要传递,如果不传递,设置为True
  • null:指定数据在保存时是否可以为空,默认不能为空,为空设置为True
  • default:指定默认值,往往会跟black一起使用-
  • help_text:帮助文本信息,在api接口文档平台和admin后端站点中会用于提示,往往跟verbose_name一致

而DateTimeField类、TimeField类也继承了DateField类,DateField类中的构造方法也有新的参数

  • auto_now:设置成True后,Django会自动添加更新记录时的时间
  • auto_now_add:设置成True后,Django会自动添加创建记录时的时间

5.修改表名

按照上面的操作生成的数据库表的表名默认为:子应用名称_模型类名小写,如果想自定义表名,只需要在数据模型类下面定义一个Meta的子类

from django.db import models


class Projects(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=200, verbose_name="项目名称", help_text='项目名称', unique=True)
leader = models.CharField(max_length=50)
programmer = models.CharField(max_length=50, verbose_name="开发人员", help_text="开发人员")
tester = models.CharField(max_length=50, verbose_name="测试人员", help_text="测试人员")
desc = models.TextField(verbose_name='项目简介', help_text="项目简介", blank=True, default="XXXX", null=True)
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间", help_text="创建时间")
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间", help_text="更新时间")

class Meta:
# Meta子类的类名固定,可以使用db_table类属性来指定表名,使用verbose_name类属性指定表的个性化描述
db_table = 'tb_projects'
verbose_name = '项目表'

三、CRUD

在CRUD操作之前,为了更好的debug,我们可以引入connection模块,它可以在我们进行CRUD操作时,会显示出对应的sql语句,通过sql语句,可以及时发现错误,也可以看到sql语句的性能是否达到最优

在视图模块中引入connection模块

from django.db import connection

调试器上添加“connetion.queries”:

【Django之Django REST Framework框架安装+Django之ORM框架】_字段名_02

1.c(create)

向数据表添加一条记录,两种方法

  • 1、使用模型类对象来创建:
project_obj = Projects(name='xxx项目3', leader='xxx项目负责人3',tester='xxx测试3', programmer='xxx研发3')
project_obj.save()
  • 2、可以使用查询集的create方法,使用模型类.objects.create()方法,无需调用save方法
project_obj = Projects.objects.create(name='xxx项目4', leader='xxx项目负责人4',tester='xxx测试4', programmer='xxx研发4')

2.u(update)

  • 1、先获取模型类对象,然后修改某些字段,再调用save方法保存
project_obj = Projects.objects.get(id=3)
project_obj.name = '某某知名项目'
project_obj.save()
  • 2、用模型类名.objects.filter(字段名=值).update(字段名=修改的值)
Projects.objects.filter(id=2).update(name='某某优秀的项目')

3.r(retrieve)

1. 获取所用记录--all()方法:qs = Projects.objects.all()
  • 返回QuerySet查询集对象(实际上是多个模型类类对象的列表)
  • 支持数字索引取值(负索引不支持,返回模型类对象,一条记录)、切片(返回QuerySet查询集对象)
  • for循环迭代,每次迭代取出一个模型类对象
  • QuerySet查询集对象.first()获取第一个记录、.last()方法获取最后一条记录
  • .count()方法,获取查询集中数据记录条数
  • 惰性查询,只有你真正去使用数据时,才会去数据库中执行sql语句,为了性能
2. 获取指定记录
  • (1)一般只能使用主键或者唯一键作为查询条件;
  • (2)如果查询的记录为空或者多条记录,会抛出异常;
  • (3)返回的模型类对象,会自动提交
project_obj = Projects.objects.get(id=1)
  • filter:通过过滤的方式查询,每个字段都提供了很丰富的选项进行查询操作
    Projects.objects.filter()
  • a.filter支持多个过滤表达式,字段名__过滤表达式,返回的是查询集
  • b.字段名__startswith、字段名__istartswith:过滤以xxx开头的字符串
  • c.字段名__endswith、字段名__iendswith:过滤以xxx结尾的字符串
  • d.字段名__gt:大于,__gte: >=, __le: <, __lte:<=
  • e.字段名=条件与字段名__exact等价,在Django ORM中有一个内置的变量pk,为数据库模型类的主键别名
  • f.__contains、__icontains、__in、__isnull
  • g.如果没有指定的记录,会返回空查询集
  • exclude:与filter相反,为反向过滤
Projects.objects.exclude(id=1)
3.关联查询
  • 通过从表的信息获取父表的记录,从表模型类名小写 _从表字段名_ 查询表达式
  • 惰性:查询集对象,只有去使用的时候,才会执行sql语句
  • qs = Projects.objects.filter(interfaces__name__regex='^[0-9]')
4.逻辑关系查询
  • 查询集支持链式调用,可以使用filter方法去过滤
  • 同一行中的多个filter是“与”的关系
qs =Projects.objects.filter(name__startswith='x').filter(programmer__contains='4')
qs = Projects.objects.filter(name__startswith='x', programmer__contains='4')
  • 查询“或”的关系
  • .filter(Q(查询条件1) | Q(查询条件2))
from django.db.models import Q
Projects.objects.filter(Q(leader__contains='1') | Q(programmer__contains='4'))
5.聚合查询

首先导入聚合函数

from django.db.models import Count,Sum,Max,Min,Avg
Projects.objects.annotate(Count("name"))
Projects.objects.annotate(Max("name"))
  • a.使用order_by来进行排序
  • b.可以使用字段名作为排序条件,默认为升序,
  • c.使用“-”字段名,为降序
  • d.可以同时指定多个排序条件
Projects.objects.all().order_by('-name')

4.d(delete)

  • 1.使用模型对象.delete()
project_obj = Projects.objects.get(id=3)
one = project_obj.delete()
  • 2.使用查询集.delete()
Projects.objects.filter(id=3).delete()
  • 收藏
  • 评论
  • 分享
  • 举报

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK