重写 DRF ListAPIView list() 方法

问题描述 投票:0回答:1

我有一个 DRF 项目,其中有一个名为“类别”的模型的

ListAPIView
。该模型有一个名为parent_category 的
ForeginKey
以及子类别的相关名称。我希望我的 URL 表现如下:

  1. 获取没有父级的类别列表:
    example.com/api/categories
  2. 获取具有某个 id 的对象的子类别列表:
    example.com/api/categories/{id_here}

models.py:

class Category(models.Model):
    name = models.CharField(max_length=100)
    parent_category = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE,
                                        related_name='subcategories')

views.py:

class CategoryList(generics.ListAPIView):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer

我不知道如何编写我的 urls.py。我需要 DRF 路由器吗?或者 Django 路径工作正常吗?我不知道该选择哪个或如何在这个项目中使用它们。我想如果我重写 ListAPIMixin 的

list()
方法,它会起作用,但我什至不知道在其中写什么。

python django django-rest-framework
1个回答
0
投票

我为自己做了一个虚拟项目并像这样实现了

您可以通过重写来做到这一点

get_queryset

示例代码

观点

from .models import Category
from rest_framework.generics import ListAPIView
from .serializers import CategorySerializer


class CategoryViewSet(ListAPIView):
    serializer_class = CategorySerializer
    def get_queryset(self):    
        parent_category = self.kwargs.get("parent_category") or None
        return Category.objects.filter(parent_category=parent_category)

网址

您可以设置多条路线选项

from django.contrib import admin
from django.urls import path
from cate.views import CategoryViewSet

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', CategoryViewSet.as_view() ,name="category"),
    path('<int:parent_category>/', CategoryViewSet.as_view() ,name="category"),
    
]

序列化器

from .models import Category
from rest_framework import serializers


class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = "__all__"
© www.soinside.com 2019 - 2024. All rights reserved.