From 35ed29b7b5adbd6d349fdcf5a8896882b5fac601 Mon Sep 17 00:00:00 2001 From: aba2222 Date: Fri, 13 Feb 2026 00:18:35 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0rest=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- forum/api.py | 50 ++++++++++++++++++++++++++++++++++++++++++ forum/models.py | 2 +- forum/urls.py | 5 +++-- lean_forum/settings.py | 10 +++++++++ requirements.txt | 1 + 5 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 forum/api.py diff --git a/forum/api.py b/forum/api.py new file mode 100644 index 0000000..1066e17 --- /dev/null +++ b/forum/api.py @@ -0,0 +1,50 @@ +from .models import Post, Comment +from rest_framework import routers, serializers, viewsets + +# Serializers define the API representation. +class CommentSerializer(serializers.ModelSerializer): + author = serializers.CharField(source="author.username") + + class Meta: + model = Comment + fields = ["id", "author", "content", "created_at"] + +class PostListSerializer(serializers.ModelSerializer): + author = serializers.CharField(source="author.username") + + class Meta: + model = Post + fields = ["id", "author", "title", "content", "created_at"] + +class PostDetailSerializer(serializers.ModelSerializer): + author = serializers.CharField(source="author.username") + comments = CommentSerializer(many=True, read_only=True) + + class Meta: + model = Post + fields = [ + "id", + "author", + "title", + "content", + "created_at", + "comments", + ] + +# ViewSets define the view behavior. +class PostViewSet(viewsets.ModelViewSet): + queryset = Post.objects.all() + + def get_queryset(self): + return Post.objects.select_related("author").prefetch_related("comments__author") + + def get_serializer_class(self): + if self.action == "list": + return PostListSerializer + return PostDetailSerializer + + +# Routers provide a way of automatically determining the URL conf. +router = routers.DefaultRouter() +router.register(r"posts", PostViewSet) + diff --git a/forum/models.py b/forum/models.py index 2a267be..d8f1a99 100644 --- a/forum/models.py +++ b/forum/models.py @@ -37,7 +37,7 @@ class Meta: ordering = ['-created_at'] class Comment(models.Model): - post = models.ForeignKey(Post, on_delete=models.CASCADE) + post = models.ForeignKey(Post, related_name="comments", on_delete=models.CASCADE) author = models.ForeignKey(User, on_delete=models.CASCADE) content = MDTextField() created_at = models.DateTimeField(auto_now_add=True) diff --git a/forum/urls.py b/forum/urls.py index e536e2d..b87f495 100644 --- a/forum/urls.py +++ b/forum/urls.py @@ -1,5 +1,5 @@ -from django.urls import path -from . import views +from django.urls import include, path +from . import views, api urlpatterns = [ path('', views.index, name='index'), @@ -14,4 +14,5 @@ path('register/', views.RegisterView.as_view(), name='register'), path('about/', views.about_view, name='about'), path('logout/', views.logout_view, name='logout'), + path('api/', include(api.router.urls)), ] diff --git a/lean_forum/settings.py b/lean_forum/settings.py index 3473822..d17484d 100644 --- a/lean_forum/settings.py +++ b/lean_forum/settings.py @@ -39,6 +39,7 @@ 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.humanize', + "rest_framework", 'mdeditor', 'webpush', 'forum', @@ -143,4 +144,13 @@ "VAPID_ADMIN_EMAIL": "admin@example.com" } +REST_FRAMEWORK = { + # Use Django's standard `django.contrib.auth` permissions, + # or allow read-only access for unauthenticated users. + "DEFAULT_PERMISSION_CLASSES": [ + "rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly", + ], + 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', + 'PAGE_SIZE': 20 +} diff --git a/requirements.txt b/requirements.txt index 7e6798f..a5b9a8d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,4 +7,5 @@ packaging>=25.0 sqlparse>=0.5.3 django-webpush>=0.3.6 bleach>=6.3.0 +djangorestframework openai From bd55b5ffa06fe0310e6a276e547efa8b7f09c3c5 Mon Sep 17 00:00:00 2001 From: aba2222 Date: Fri, 13 Feb 2026 00:50:21 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E5=B0=86comment=5Fset=E6=94=B9?= =?UTF-8?q?=E5=90=8D=E4=B8=BAcomments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- forum/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forum/views.py b/forum/views.py index 2ab7f88..6e0d760 100644 --- a/forum/views.py +++ b/forum/views.py @@ -91,7 +91,7 @@ def get(self, request, post_id): if request.user.is_authenticated: forms = MDEditorCommentForm(user=request.user, post=post) - comments = post.comment_set.all().order_by('created_at') + comments = post.comments.all().order_by('created_at') post.content = markdown.markdown( post.content, extensions=['extra', 'codehilite', 'toc']