Skip to content

Commit 39a0021

Browse files
author
zmrenwu
committed
Step8: 实现分类、标签、归档日期接口
1 parent 7999472 commit 39a0021

File tree

6 files changed

+61
-7
lines changed

6 files changed

+61
-7
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ $ git clone https://github.com/HelloGitHub-Team/HelloDjango-REST-framework-tutor
196196
7. [分页](https://www.zmrenwu.com/courses/django-rest-framework-tutorial/materials/96/)
197197
8. [文章详情 API](https://www.zmrenwu.com/courses/django-rest-framework-tutorial/materials/97/)
198198
9. [在接口返回Markdown解析后的内容](https://www.zmrenwu.com/courses/django-rest-framework-tutorial/materials/98/)
199+
10. [实现分类、标签、归档日期接口](https://www.zmrenwu.com/courses/django-rest-framework-tutorial/materials/99/)
199200

200201
## 公众号
201202
<p align="center">

blog/filters.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from django_filters import rest_framework as drf_filters
2+
3+
from .models import Post
4+
5+
6+
class PostFilter(drf_filters.FilterSet):
7+
created_year = drf_filters.NumberFilter(
8+
field_name="created_time", lookup_expr="year"
9+
)
10+
created_month = drf_filters.NumberFilter(
11+
field_name="created_time", lookup_expr="month"
12+
)
13+
14+
class Meta:
15+
model = Post
16+
fields = ["category", "tags", "created_year", "created_month"]

blog/urls.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,4 @@
1111
),
1212
path("categories/<int:pk>/", views.CategoryView.as_view(), name="category"),
1313
path("tags/<int:pk>/", views.TagView.as_view(), name="tag"),
14-
# path("api/index/", views.IndexPostListAPIView.as_view()),
15-
path("api/index/", views.index),
1614
]

blog/views.py

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
1-
from django.contrib import messages
2-
from django.db.models import Q
3-
from django.shortcuts import get_object_or_404, redirect, render
1+
from django.shortcuts import get_object_or_404
42
from django.views.generic import DetailView, ListView
3+
from django_filters.rest_framework import DjangoFilterBackend
54
from rest_framework import mixins, status, viewsets
6-
from rest_framework.decorators import api_view
5+
from rest_framework.decorators import action
76
from rest_framework.generics import ListAPIView
87
from rest_framework.pagination import PageNumberPagination
98
from rest_framework.permissions import AllowAny
109
from rest_framework.response import Response
10+
from rest_framework.serializers import DateField
11+
from rest_framework.views import APIView
1112

1213
from pure_pagination.mixins import PaginationMixin
1314

15+
from .filters import PostFilter
1416
from .models import Category, Post, Tag
15-
from .serializers import PostListSerializer, PostRetrieveSerializer
17+
from .serializers import (
18+
CategorySerializer,
19+
PostListSerializer,
20+
PostRetrieveSerializer,
21+
TagSerializer,
22+
)
1623

1724

1825
class IndexView(PaginationMixin, ListView):
@@ -84,11 +91,40 @@ class PostViewSet(
8491
"list": PostListSerializer,
8592
"retrieve": PostRetrieveSerializer,
8693
}
94+
filter_backends = [DjangoFilterBackend]
95+
filterset_class = PostFilter
8796

8897
def get_serializer_class(self):
8998
return self.serializer_class_table.get(
9099
self.action, super().get_serializer_class()
91100
)
92101

102+
@action(
103+
methods=["GET"], detail=False, url_path="archive/dates", url_name="archive-date"
104+
)
105+
def list_archive_dates(self, request, *args, **kwargs):
106+
dates = Post.objects.dates("created_time", "month", order="DESC")
107+
date_field = DateField()
108+
data = [date_field.to_representation(date) for date in dates]
109+
return Response(data=data, status=status.HTTP_200_OK)
110+
93111

94112
index = PostViewSet.as_view({"get": "list"})
113+
114+
115+
class CategoryViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
116+
serializer_class = CategorySerializer
117+
# 关闭分页
118+
pagination_class = None
119+
120+
def get_queryset(self):
121+
return Category.objects.all().order_by("name")
122+
123+
124+
class TagViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
125+
serializer_class = TagSerializer
126+
# 关闭分页
127+
pagination_class = None
128+
129+
def get_queryset(self):
130+
return Tag.objects.all().order_by("name")

blogproject/settings/common.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"pure_pagination", # 分页
3333
"haystack", # 搜索
3434
"rest_framework",
35+
"django_filters",
3536
"blog.apps.BlogConfig", # 注册 blog 应用
3637
"comments.apps.CommentsConfig", # 注册 comments 应用
3738
]

blogproject/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222

2323
router = routers.DefaultRouter()
2424
router.register(r"posts", blog.views.PostViewSet, basename="post")
25+
router.register(r"categories", blog.views.CategoryViewSet, basename="category")
26+
router.register(r"tags", blog.views.TagViewSet, basename="tag")
2527

2628
urlpatterns = [
2729
path("admin/", admin.site.urls),

0 commit comments

Comments
 (0)