Django+DRF 快速入门

搭建开发环境

操作系统:Windows10

Python版本:Python3.10

创建虚拟机:

# 创建虚拟环境
python -m venv django

# 激活虚拟环境
djangoScriptsactivate


安装Django:

pip install django

安装Django Rest Framework:

pip install djangorestframework


创建项目

执行命令:

# 创建项目
django-admin startproject z01_hello

# 进入项目
cd z01_hello

# 启动项目
python manage.py runserver


修改配置,将DRF框架引入:

# 应用列表
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
# 引入DRF框架
"rest_framework",
]


创建应用

执行命令:

python .manage.py startapp order


以上命令创建了一个订单的应用,将该应用添加到配置中:

# 应用列表
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
# 引入DRF框架
"rest_framework",
# 自定义的应用
"order",
]


订单模型

关于订单表的内容可以参考如下图:

Django+DRF 快速入门


我们先不考虑表与表之间的关系,设计一张单表,能够包含表格中要展示的所有内容。

  • name:商品名称,字符串类型

  • price:价格,浮点数类型

  • buyer:买家,字符串类型

  • payTime:交易时间,日期时间类型

  • category:分销信息,整数类型,1表示经理,2表示分销员

  • status:状态,布尔类型,1已完成,0未完成

  • payType:支付方式,整数类型,1表示支付宝,2表示微信,3表示平台币

  • goodsUrl:商品地址,网址类型

有了以上基本信息以后,我们就可以开始着手编写模型了。

在order/models.py中填写关于订单表的模型信息如下:

from ast import Mod
from django.db import models


class Order(models.Model):
# name:商品名称,字符串类型
name = models.CharField(max_length=128, verbose_name="商品名称")
# price:价格,浮点数类型
price = models.DecimalField(
max_digits=8, decimal_places=2, verbose_name="价格")
# buyer:买家,字符串类型
buyer = models.CharField(max_length=128, verbose_name="买家")
# payTime:交易时间,日期时间类型
pay_time = models.DateTimeField(verbose_name="交易时间")
# category:分销信息,整数类型,1表示经理,2表示分销员
category = models.IntegerField(verbose_name="分销信息")
# status:状态,布尔类型,1已完成,0未完成
status = models.BooleanField(verbose_name="状态")
# payType:支付方式,整数类型,1表示支付宝,2表示微信,3表示平台币
pay_type = models.IntegerField(verbose_name="支付方式")
# goodsUrl:商品地址,网址类型
goods_url = models.URLField(verbose_name="商品地址")

class Meta:
verbose_name = "订单表"
verbose_name_plural = verbose_name

def __str__(self) -> str:
return self.name


模型创建好以后,我们迁移模型:

python manage.py makemigrations
python manage.py migrate


添加测试数据

进入shell环境:

python manage.py shell


添加几条测试数据:

from order.models import Order
for i in range(100):
Order.objects.create(name=f"商品{i}", price=33.33, buyer="张大鹏", pay_time="2022-09-11 11:22:22", category=1,status=1,pay_type=1,goods_url="http://www.taobao.com")

# 查询
Order.objects.all()

序列化类

序列化类的作用是将Django的对象转换为JSON字符串。DRF提供的序列化类用法和Django的model用法类似,字段名称和类型几乎都一样。

from rest_framework import serializers
from .models import Order


class OrderSerializer(serializers.Serializer):
# name:商品名称,字符串类型
name = serializers.CharField(max_length=128)
# price:价格,浮点数类型
price = serializers.DecimalField(
max_digits=8, decimal_places=2)
# buyer:买家,字符串类型
buyer = serializers.CharField()
# payTime:交易时间,日期时间类型
pay_time = serializers.DateTimeField()
# category:分销信息,整数类型,1表示经理,2表示分销员
category = serializers.IntegerField()
# status:状态,布尔类型,1已完成,0未完成
status = serializers.BooleanField()
# payType:支付方式,整数类型,1表示支付宝,2表示微信,3表示平台币
pay_type = serializers.IntegerField()
# goodsUrl:商品地址,网址类型
goods_url = serializers.URLField()

视图类

视图类存放的是与前端交互的核心逻辑代码。

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Order
from .serializers import OrderSerializer


class OrderView(APIView):
def get(self, request, *args, **kwargs):
# 获取queryset
orders = Order.objects.all()[:10]
# 序列化多条数据
orders_json = OrderSerializer(orders, many=True)
# 返回序列化对象
print(orders_json.data)
return Response(orders_json.data)

路由

路由存放的是路径和视图的对应关系。

from django.contrib import admin
from django.urls import path
from order.views import OrderView

urlpatterns = [
path("admin/", admin.site.urls),
path("orders/", OrderView.as_view()),
]

运行测试

访问:http://127.0.0.1:8000/orders/

Django+DRF 快速入门


Linux中运行

修改settings.py,配置远程访问:

ALLOWED_HOSTS = ["*"]

创建run.sh启动脚本,避免每次输入大量命令:

# 添加文件
vim run.sh

# 添加内容
python manage.py runserver 0.0.0.0:8888

# 保存退出,然后赋予可执行权限
chmod +x run.sh

启动服务:

./run.sh


访问:http://172.26.95.237:8888/orders/

把这里的IP换成你自己的虚拟机ip,查看ip的命令如下:

ip addr | grep inet


测试数据优化

之前的测试数据不够真实,我们可以引入zdppy_random库,让数据更加真实一下。

from order.models import Order
import zdppy_random


def init_order():
for i in range(100):
Order.objects.create(
name=f"商品{i}",
price=zdppy_random.random_int(30, 300),
buyer="张大鹏",
pay_time=zdppy_random.random_datetime_str("2022-08-01 00:00:00", "2022-09-01 00:00:00"),
category=zdppy_random.random_int(0, 6),
status=zdppy_random.random_int(0, 1),
pay_type=zdppy_random.random_int(0, 4),
goods_url=zdppy_random.random_url())


if __name__ == "__main__":
init_order()


再次访问:http://127.0.0.1:8000/orders/

Django+DRF 快速入门


单独执行测试数据生成脚本

除了在shell中引入生成数据的方法执行,Django中还可以单独执行某个脚本文件,只需要在文件头部加入以下代码即可:

import os
import django

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'z01_hello.settings')
django.setup()

修改后完整的代码如下:

import os
import django

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'z01_hello.settings')
django.setup()

# 上面的代码必须要先导入
from order.models import Order
import zdppy_random


def init_order():
# 先清空之前的数据
Order.objects.all().delete()

# 再创建
for i in range(100):
Order.objects.create(
name=f"商品{i}",
price=zdppy_random.random_int(30, 300),
buyer="张大鹏",
pay_time=zdppy_random.random_datetime_str("2022-08-01 00:00:00", "2022-09-01 00:00:00"),
category=zdppy_random.random_int(0, 6),
status=zdppy_random.random_int(0, 1),
pay_type=zdppy_random.random_int(0, 4),
goods_url=zdppy_random.random_url())

# 查看
for o in Order.objects.all():
print(o.name, o.price, o.pay_time)


if __name__ == "__main__":
init_order()


控制台输出如下:

Django+DRF 快速入门




原文始发于微信公众号(张大鹏520):Django+DRF 快速入门

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/48644.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!