DRF(一):配置、基本应用

本文介绍了DRF(Django REST framework)的配置步骤,包括pip安装和在settings.py中的激活。详细讲解了DRF中的请求和响应,如Django-request和DRF-request的不同,以及DRF-response的使用。接着,文章阐述了如何使用DRF的api_view,处理POST、PUT、PATCH等请求,并探讨了DRF的序列化器在数据接收和返回中的作用。最后,讨论了在实际项目中如何利用DRF完善user模块的增删改查功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DRF配置步骤
  1. pip安装
djangorestframework
markdown
django-filter
  1. 在settings.py中激活
INSTALLED_APPS = [
	……
    'rest_framework'
]
DRF中的请求和响应
  • Django-request
    类型:WSGIRequest
    方式:GET、POST

  • Django-response
    HttpResponse、render、redirect、JsonResponse

  • DRF-request
    类型:rest_framework.request
    request.POST:POST
    request.data:POST\PUT\PATCH

  • DRF-response
    Response(data)

DRF使用
api_view

@api_view(["GET", "POST", ...])
①限定请求方式;
②改变request类型。

请求request
  1. 接收POST\PUT\PATCH
    params = request.data.dict()

  2. 接收GET
    request.query_params

响应response
from rest_framework.response import Response
from rest_framework import status

def xx:
	query_set = User.objects.all()
	
	# 序列化,结果为字符串
	data = serialize("json", query_set)
	
	# 转化为json
	data = json.loads(data)
	
	return Response(data, status=status.HTTP_200_OK)
  1. Response会直接将json格式的数据进行排版:
    在这里插入图片描述
  2. csrf在drf中失效
  3. 状态码:
    默认200
    状态码的官方解释
响应参数:drf序列化器
  • django中的序列化
    django.forms.model_to_dict(针对模型对象)
    django.core.serializers.serialize(针对queryset)

  • drf中的序列化
    from rest_framework.serializers import Serializer(类似form)
    from rest_framework.serializers import ModelSerializer(类似modelform)

  • Serializer

  1. 在应用下新建serializers.py
from rest_framework import serializer

class UserSerializer(serializers.Serializer):
	# 定义需要接收的数据
    username = serializers.CharField()
    password = serializers.CharField()
    gender = serializers.CharField()
    tel = serializers.CharField()

接收数据时只收到serializer中定义的字段;
不会默认增加pk字段

  1. 用于返回对象
from .serializers import *

# 查询用户
@api_view(["GET"])
def find_user(request):
    
    users = User.objects.all()
    # 默认序列化单个数据,序列化多个数据时设置many=True
    serializer = UserSerializer(users, many=True)
    return Response(serializer.data, status=status.HTTP_200_OK)

  1. 用于接收参数
# 增加用户
@api_view(["POST"])
@csrf_exempt
def add_user(request):

    # 接收参数
    serializer = UserSerializer(data=request.data)

    # 校验通过:
    if serializer.is_valid():
        # 存储数据
        params = request.data.dict()
        user = User.objects.create(**params)
        user = model_to_dict(user)

        return Response(user, status=status.HTTP_201_CREATED)

    # 校验失败:
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

上面的代码如果直接使用serializer.save()存储数据会报错:
'create()' must be implemented.
解决:
在serializer.py中重写父类的create方法

from rest_framework import serializers

from user.models import *


class UserSerializer(serializers.Serializer):
    username = serializers.CharField()
    password = serializers.CharField()
    gender = serializers.CharField()
    tel = serializers.CharField()

    def create(self, validated_data):
        """
        存储数据
        :param validated_data: 校验通过的数据
        :return: 
        """
        return User.objects.create(**validated_data)

在视图中调用

# 增加用户
@api_view(["POST"])
@csrf_exempt
def add_user(request):

    # 接收参数
    serializer = UserSerializer(data=request.data)

    # 校验通过:(校验属性写在UserSerializer中)
    if serializer.is_valid():
        # 存储数据
        serializer.save()

        return Response(serializer.validated_data, status=status.HTTP_201_CREATED)

    # 校验失败:
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
使用drf完善项目应用user的增删改查功能
  • 修改时如果报错"This field is required."
    在UserSerializer的字段中增加约束require=False:
    username = serializers.CharField(required=False)
  • 代码
# ==============================urls.py===================================
from django.urls import path

from user import views

urlpatterns = [

    path('add', views.add_user, name='add'),
    path('find', views.find_user, name='find'),
    path('alter/<int:pk>', views.alter_user, name='alter'),
    path('delete/<int:pk>', views.delete_user, name='delete'),

    path('query/<int:pk>', views.query_user, name='query')

]


# ==============================serializers.py===================================
from rest_framework import serializers

from user.models import *


class UserSerializer(serializers.Serializer):
    username = serializers.CharField(required=False)
    password = serializers.CharField(required=False)
    gender = serializers.CharField(required=False)
    tel = serializers.CharField(required=False)

    def create(self, validated_data):
        """
        存储数据
        :param validated_data: 校验通过的数据
        :return:
        """
        return User.objects.create(**validated_data)

    def update(self, instance, validated_data):
        """
        :param instance: 查询到的对象
        :param validated_data: 校验通过的数据
        :return:
        """
        users = User.objects.filter(pk=instance.pk)
        users.update(**validated_data)

        return users[0]

# ==============================views.py===================================
import json

from django.core.serializers import serialize
from django.shortcuts import render
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

from user.models import *
from django.forms import model_to_dict

from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status

from .serializers import *

# 增加用户
@api_view(["POST"])
@csrf_exempt
def add_user(request):
    # params = request.POST.dict()
    # user = User.objects.create(**params)
    # user = model_to_dict(user)

    # params = request.data.dict()
    # user = User.objects.create(**params)
    # user = model_to_dict(user)
    # return Response(user, status=status.HTTP_201_CREATED)

    # # 接收参数
    # serializer = UserSerializer(data=request.data)
    #
    # # 校验通过:(校验属性写在UserSerializer中)
    # if serializer.is_valid():
    #     # 存储数据
    #     params = request.data.dict()
    #     user = User.objects.create(**params)
    #     user = model_to_dict(user)
    #
    #     return Response(user, status=status.HTTP_201_CREATED)
    #
    # # 校验失败:
    # return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    # 接收参数
    serializer = UserSerializer(data=request.data)

    # 校验通过:(校验属性写在UserSerializer中)
    if serializer.is_valid():
        # 存储数据
        serializer.save()

        return Response(serializer.validated_data, status=status.HTTP_201_CREATED)

    # 校验失败:
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

# 查询用户
@api_view(["GET"])
def find_user(request):
    # users = User.objects.all()
    # data = serialize("json", users)
    # # return Response(data, safe=False, json_dumps_params={"ensure_ascii": False})
    # return Response(json.loads(data), status=status.HTTP_200_OK)

    users = User.objects.all()
    serializer = UserSerializer(users, many=True)
    return Response(serializer.data, status=status.HTTP_200_OK)


# 修改用户
@api_view(["PUT"])
def alter_user(request, pk):

    user = User.objects.get(pk=pk)

    serializer = UserSerializer(instance=user, data=request.data)

    if serializer.is_valid():
        # 更新方法与新增相同
        serializer.save()

        return Response(serializer.data, status=status.HTTP_200_OK)

    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


# 删除用户
@api_view(["DELETE"])
def delete_user(request, pk):

    User.objects.filter(pk=pk).delete()

    return Response(status=status.HTTP_204_NO_CONTENT)


# 查询单个用户
@api_view(["POST"])
def query_user(request, pk):

    user = User.objects.filter(pk=pk)

    if user.exists():

        serializer = UserSerializer(instance=user, data=request.data)

        return Response(serializer.data, status=status.HTTP_200_OK)

    return Response(status=status.HTTP_400_BAD_REQUEST)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值