django框架搭建API接口代码示例与步骤
https://docs.djangoproject.com/zh-hans/5.0/
https://q1mi.github.io/Django-REST-framework-documentation/api-guide/routers_zh/
https://django-vue-admin.com/guide/getting-started
1 安装python,下载对应的版本,我的是3.12.3
https://www.python.org/downloads/
2 安装django
python -m pip install Django
查看版本
python -m django --version
3 创建项目:https://docs.djangoproject.com/zh-hans/5.0/intro/tutorial01/
django-admin startproject mysite
启动
python manage.py runserver 9192
4 创建应用
python manage.py startapp polls
添加应用mysite.py文件中
INSTALLED_APPS = [
...
'polls',
...
]
5 写代码:
打开 polls/views.py,把下面这些 Python 代码输入进去:
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
路由(应用):polls/urls.py
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
]
路由(项目):mysite/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path("polls/", include("polls.urls")),
path("admin/", admin.site.urls),
]
启动测试:
python manage.py runserver 9192
或者在manage.py文件中添加:
if __name__ == '__main__':
if sys.argv[1] == 'runserver' and len(sys.argv) == 2:
sys.argv.append('9192') # 默认端口
main()
7 生成 requirements.txt 文件
pip freeze > requirements.txt
8 安装依赖 requirements.txt 文件
pip install -r requirements.txt
9 接口API示例‘增删改查’CURD,用框架djangorestframework,即rest_framework
polls/views.py
from rest_framework import viewsets, filters,status,permissions
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination
from django_filters.rest_framework import DjangoFilterBackend
from .models import News
from .serializers import NewsSerializer
# 自定义分页类
class NewsPagination(PageNumberPagination):
page_size = 10 # 每页显示的条数
page_size_query_param = 'size' # 前端控制每页显示条数的参数
max_page_size = 100 # 最大每页显示条数
page_query_param = 'page' # 页码参数
class NewsViewSet(viewsets.ModelViewSet):
queryset = News.objects.all()
serializer_class = NewsSerializer
pagination_class = NewsPagination
filter_backends = [DjangoFilterBackend, filters.SearchFilter]
filterset_fields = ['created_at'] # 允许通过 created_at 字段进行过滤
search_fields = ['title'] # 允许通过 title 字段进行搜索
http_method_names = ['get', 'post', 'put', 'patch', 'delete']
permission_classes = [permissions.AllowAny] # 允许所有请求
def get_queryset(self):
queryset = super().get_queryset()
title = self.request.query_params.get('title', None)
start_date = self.request.query_params.get('start_date', None)
end_date = self.request.query_params.get('end_date', None)
if title:
queryset = queryset.filter(title__icontains=title)
if start_date and end_date:
queryset = queryset.filter(created_at__range=[start_date, end_date])
return queryset
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
response = self.get_paginated_response(serializer.data)
return response
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
# 创建新闻
def create(self, request):
serializer = NewsSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# 获取单条新闻
def retrieve(self, request, pk=None):
try:
news = News.objects.get(pk=pk)
except News.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
serializer = NewsSerializer(news)
return Response(serializer.data)
# 更新新闻
def update(self, request, pk=None):
try:
news = News.objects.get(pk=pk)
except News.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
serializer = NewsSerializer(news, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# 删除新闻
def destroy(self, request, pk=None):
try:
news = News.objects.get(pk=pk)
except News.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
news.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
polls/models.py
from django.db import models
class News(models.Model):
title = models.CharField(max_length=255)
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
company_id = models.IntegerField() # 添加 company_id 字段
category_id = models.IntegerField() # 添加 company_id 字段
class Meta:
db_table = 'news' #
def __str__(self):
return self.title
polls/serializers.py
from rest_framework import serializers
from .models import News
class NewsSerializer(serializers.ModelSerializer):
class Meta:
model = News
fields = '__all__'
def validate_company_id(self, value):
"""
自定义验证方法,确保 company_id 是数字类型
"""
if not isinstance(value, int):
raise serializers.ValidationError("company_id 必须是数字类型")
return value
def validate_category_id(self, value):
if not isinstance(value, int):
raise serializers.ValidationError("category_id 必须是数字类型")
return value
polls/urls.py
from django.urls import path,include
from . import views
from rest_framework.routers import DefaultRouter
from .views import NewsViewSet
router = DefaultRouter()
router.register(r'news333', NewsViewSet)
urlpatterns = [
path('', include(router.urls)),
mysite/urls.py
from django.contrib import admin
from django.urls import path, include # 注意导入 include
urlpatterns = [
path('admin/', admin.site.urls),
# path('polls/', include('polls.urls')),
path('api/', include('polls.urls')),
]
或者这样自定义每个单独的URL
# polls/urls.py
from django.urls import path,include
from . import views
from rest_framework.routers import DefaultRouter
from .views import NewsViewSet
# router = DefaultRouter()
# router.register(r'news333', NewsViewSet)
urlpatterns = [
# path('', include(router.urls)),
# 对应的网址:http://127.0.0.1:9192/polls/news/detail/1/
path('news/detail/<int:pk>/', NewsViewSet.as_view({'get': 'retrieve'}), name='news-detail'),
# 对应的网址:http://127.0.0.1:9192/polls/news/my_detail/1/
path('news/my_detail/<int:pk>/', NewsViewSet.as_view({'get': 'my_detail'}), name='news-my_detail'),
path('news/list/', NewsViewSet.as_view({'get': 'list'}), name='news-list'),
path('news/update/<int:pk>/', NewsViewSet.as_view({'post': 'update_news'}), name='news-update'),
path('news/delete/<int:pk>/', NewsViewSet.as_view({'post': 'delete_news'}), name='news-delete'),
path('news/add/', NewsViewSet.as_view({'post': 'add_news'}), name='news-add'),
]
mysite/sittings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls',
'rest_framework',
]
结束