快速搭建django-rest framework项目

这篇博客详细介绍了如何使用Django框架搭建RESTful API。从创建项目、安装依赖到配置数据库,再到建立模型、序列化、编写视图和设置路由,每个步骤都清晰阐述。最后,通过浏览器API测试验证了项目的成功运行。此外,还展示了如何自定义模型的表名。

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

1.新建Djngo项目

django-admin startproject drf_demo

2.添加依赖

利用pip来添加需要的REST framework的依赖

pip install djangorestframework

3.在settings.py的INSTALLED_APPS中添加’rest_framework’。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework'
]

4.修改数据库配置

配置本地数据库

  1. 连接数据库mysql -u用户名 -p密码
  2. 新建数据库create database 数据库名称

修改setting.py中的DATABASES配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 数据库引擎
        'NAME': 'drf_demo', # 数据库名
        'USER': 'root', # 账号
        'PASSWORD': '123456', # 密码
        'HOST': '127.0.0.1', # HOST
        'POST': 3306, # 端口
    }
}

setting中的配置默认为sqlite3数据库 当需要修改成MySql时,需要在setting.py的同级目录的__init__.py 加入如下配置,否则会报错: Error loading MySQLdb module.

import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()

5. 新建模型

进入项目,执行语句 python manage.py startapp student,打开student/models.py文件,创建模型

class Student(models.Model):
    name = models.CharField(u'姓名', max_length=100, default='no_name')
    sex = models.CharField(u'性别',max_length=50,default='male')
    sid = models.IntegerField(u'学号',default='0')
 
    def __unicode__(self):
        return '%d: %s' % (self.pk, self.name)

在settings.py的INSTALLED_APPS中注册。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'student'
]

执行数据库同步和迁移命令,自动建立数据表

python manage.py makemigrations
python manage.py migrate

在这里插入图片描述

6. 编写api

序列化
在student下面新建serializers.py,代码内容为:

from rest_framework import serializers
from .models import Student


class StudentSerializers(serializers.ModelSerializer):
    class Meta:
        model = Student  # 指定的模型类
        fields = '__all__'  # 需要序列化的属性

在同目录下views.py中编写视图

from rest_framework import viewsets
from .models import Student
from rest_framework import status
from rest_framework.response import Response
from .serializers import StudentSerializers
# Create your views here.
 
class StudentViewSet(viewsets.ModelViewSet):
    # 指定结果集并设置排序
    queryset = Student.objects.all().order_by('-pk')
    # 指定序列化的类
    serializer_class = StudentSerializers
    def get(self, request):
        queryset = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

    def get_retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

    def put(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)

        if getattr(instance, '_prefetched_objects_cache', None):
            # If 'prefetch_related' has been applied to a queryset, we need to
            # forcibly invalidate the prefetch cache on the instance.
            instance._prefetched_objects_cache = {}

        return Response(serializer.data)

    def delete(self, request, pk):
        instance = self.get_object()
        self.perform_destroy(instance)
        return Response(status=status.HTTP_204_NO_CONTENT)

    def perform_destroy(self, instance):
        instance.delete()

设置路由

from django.contrib import admin
from django.urls import path
from student.views import StudentViewSet
urlpatterns = [
    path('admin/', admin.site.urls),
    path('student/', StudentViewSet.as_view({'get': 'get', 'post': 'post'})),
    path('student/<pk>',StudentViewSet.as_view({'get': 'get_retrieve','put':'put','delete':'delete'}))
]

7.浏览器API测试

启动项目。在控制台输入命令

python manage.py runserver

出现下图则启动成功
在这里插入图片描述
访问http://127.0.0.1:8000/student/
出现下图代表成功
在这里插入图片描述

其他
自定义表名

class GroupMember(models.Model):
    Group = models.ForeignKey(to=Group,help_text='组织',on_delete=models.CASCADE)
    GroupMember = models.ForeignKey(to=User, help_text='组织成员',on_delete=models.CASCADE)

    # 通过db_table自定义数据表名
    class Meta:
        db_table = 'tb_groupMember'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值