使用Django创建一个项目
📌django一般工作流程:①编写相应的urls.py;②编写数据库models.py;③编写处理HTTP请求的视图函数view.py
1 创建一个APP
一个APP即一个子系统、模块等。
- 在工程目录下键入("demo"为app名称):python manage.py startapp demo

- 在setting.py中注册该APP,要与创建名保持一致

2 数据存储与展示
2.1 后台管理系统设置
- Django默认包含的应用需要导入数据表,在工程目录下,键入python manage.py migrate
- 使用Django自带的后台管理系统,需要在命令行先创建超级管理用户,在工程目录键入python manage.py createsuperuser
设置用户名密码,邮箱可以直接回车。密码安全性太低会有提示,但无所谓。

- 在工程目录下键入python manage.py runserver启动服务器,再在浏览器输入http://localhost:8000/admin/ 测试

- 输入上面设置的用户名密码登录,在该后台管理系统就可以管理项目中用到的数据表

2.2 创建新表
- 利用models.py创建新表,一个类就是数据库中的一个表,类中的变量就是表中的字段。根据表结构来设计models中的类
📌该项目的数据库设计:一个表存储各个传感器的具体信息,一个表存储所有传感器的实时数据(以外键来区别不同的传感器)

- 在工程目录下键入python manage.py makemigrations创建迁移文件,再键入python manage.py migrate完成迁移文件的导入

- 若想要在创建后的类在Django后台管理系统进行管理,就需要在admin.py里头注册

启动服务器后,在后台可以看到多了两个数据表

- 在表中添加数据

附: models中的字段类型
https://docs.djangoproject.com/zh-hans/4.2/ref/models/fields/#field-types
3 访问配置注释1
3.1 路由配置
- 为了方便后端的实现,作为django做后端api服务的一种常用插件,django-rest-framework(DRF)提供了许多好用的特性,所以本文demo中也应用一下,命令行输入命令安装:pip install django-rest-framework
- 将DRF配置到django项目中,打开settings.py文件,添加'rest_framework',

- 在demo目录下新建urls.py文件,方便后面的路由配置
- 对整个项目的路由进行配置(在project的urls.py文件中编写),让除了访问admin/之外的所有路径转到demo应用中的urls.py文件配置进行处理

3.1.1 路由映射
- SimpleRouter
在demo目录下的urls.py文件中编写路由映射,即一个url对应后端需要传输怎样的数据(视图集)。rest_framework中的SimpleRouter可以满足一些基本的增删改查url路由,如list、create、delete、update、retrieve。

| 比如在这里的router里面注册了'sensor'url,则SimpleRouter可以将这个url拓展为:①get、post:/sensor/;②get、put、delete:/sensor/1/ 等等

①/sensor/

②/sensor/1
- 将router中的url添加到urlpatterns

- 除了SimpleRouter中简单的url之外,还可以在urlpatterns中添加一些我们需要的url,比如这里添加的:①获得所有传感器的最新数据;②获得指定传感器的最新数据

接下来就是在views.py中编写视图集了,即对应的url可以获得到怎样的数据
3.2 跨域配置
前后端分离的项目往往涉及跨域的问题,为了保证安全,通常需要遵循同源策略,即“协议、域名、端口”三者都相同。这里将对后端部分进行跨域问题的解决,对于django的跨域问题,网上比较常用的做法就是利用django-cors-headers模块来解决。
- 在命令行中进行模块安装pip install django-cors-headers
- 在项目的setting.py文件中添加该模块'corsheaders''corsheaders.middleware.CorsMiddleware'

并将这两个设置为true

3.3 前端请求处理
在demo目录下新建serializer.py文件,并对model中的类编写对应序列化器Serializer,方便将实例序列化,转化成json格式返回给用户

在demo目录下的views.py中对视图集进行编写,实现以下功能:
在实现功能之前,你需要import一些包:
from django.http import JsonResponse
from rest_framework import viewsets
from rest_framework.decorators import action
# 这里是你models.py中的类和serializer.py中的序列器
from demo.models import Sensor, SensorData
from demo.serializer import SensorsSerializer, DatasSerializer
Python
所需功能如下:
- 获取所有传感器的信息
Sensor.objects.all()就可以实现Sensor表中所有记录的获取
class SensorsViewSet(viewsets.ModelViewSet):
# 获取所有传感器信息
queryset = Sensor.objects.all()
serializer_class = SensorsSerializer
Python
- 获取指定id的传感器的所有数据和最新数据
这里就需要先的到url中传过来的id是多少,再用filter筛选出该属于该id传感器的所有数据
由于SimpleRouter没有提供获取最新数据的功能,所以需要我们设计方法。这里的latest方法就是实现获取某个传感器最新数据的功能的,方法的定义使用了action装饰器:
action装饰器可以接收两个参数:
-
-
- methods: 声明该action对应的请求方式,列表传递
- detail: 声明该action的路径是否与单一资源对应,及是否是xxx//action方法名/
- True 表示路径格式是xxx/<pk>/action方法名/
- False 表示路径格式是xxx/action方法名/
-
ORM的一些操作:filter(fid = id)、latest('time')
class DatasViewSet(viewsets.ModelViewSet):
serializer_class = DatasSerializer
# 获取指定id的传感器的所有数据
def get_queryset(self):
id = self.kwargs['id']
queryset = SensorData.objects.filter(fid = id)
return queryset
# 获取指定id的传感器的最新数据
@action(methods=['get'], detail = True) #用get方法,不带pk时候用False
def latest(self, request, id):
instance = SensorData.objects.filter(fid = id)
if instance:
instance = instance.latest('time')
ser = self.serializer_class(instance, many=False)
return JsonResponse(ser.data, safe = False)
Python
- 获取所有的传感器的最新数据
class LatestDatasViewSet(viewsets.ModelViewSet):
# 获取所有的传感器的最新数据
@action(methods=['get'], detail = False)
def latest_data(self, request):
sensors = Sensor.objects.values()
latest_data_list = []
for sensor in sensors:
# print(sensor)
data = sensor
latest_data = SensorData.objects.filter(fid = sensor['id'])
if latest_data:
latest_data = latest_data.latest('time')
data['data'] = latest_data.data
data['time'] = latest_data.time
data['state'] = latest_data.state
latest_data_list.append(data)
# print(data)
return JsonResponse(latest_data_list, safe=False)
Python
像上面使用action装饰器的方法,在demo目录下的urls.py文件(上面步骤已经编写过)中需要在as_view({})中写明调用的是哪个视图集中的哪个方法

附:ORM的一些操作
https://www.cnblogs.com/Mr-shen/p/12169368.html书签:ORM查询操作 - Mr沈 - 博客园
[注释1] https://www.zhihu.com/tardis/zm/art/128976272?source_id=1003

浙公网安备 33010602011771号