【问题标题】:django rest api json data category subcategorydjango rest api json 数据类别子类别
【发布时间】:2020-11-19 07:23:10
【问题描述】:

我正在尝试根据父 ID 访问子类别。当我检查子类别 api 时,它显示所有具有所有父 ID 的数据。我无法根据父 ID 过滤子类别。我正在尝试根据父 ID 获取 json 数据。

如果我们的父 id 是 7,那么我需要所有子类别的父 id 为 7。请指导我如何做到这一点。

models.py

class Category(models.Model):
    name = models.CharField(max_length=254, unique=True)

    
    status = models.BooleanField(default=True)

    def __str__(self):
        return self.name


class SubCategory(models.Model):
    name = models.CharField(max_length=254, unique=True)
    id_parent = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
    price = models.IntegerField()
    status = models.BooleanField(default=True)

    def __str__(self):
        return self.name

json

[
 {
     "id": 1,
     "name": "IT Servic",
     "price": 2000,
     "status": true,
     "id_parent": 7
 },
 {
     "id": 2,
     "name": "Web Development",
     "price": 1000,
     "status": true,
     "id_parent": 8
 },
 {
     "id": 3,
     "name": "Digital Marketing",
     "price": 3000,
     "status": true,
     "id_parent": 7
 },
 {
     "id": 4,
     "name": "RO Repair",
     "price": 3444,
     "status": true,
     "id_parent": 9
 }
]

serializers.py

class CategorySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Category
        fields = '__all__'


class SubCategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = SubCategory
        fields = '__all__'
    lookup_field = 'id_parent'

views.py*

class CategoryViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)
    serializer_class = CategorySerializer
    def get_queryset(self):
        user = self.request.user
        if user.is_authenticated:
            if user is not None:
                if user.is_active and user.is_superuser:
                    return Category.objects.all()
                raise PermissionDenied()
            raise PermissionDenied()                    
        raise PermissionDenied()


class SubCategoryViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)
    def get_queryset(self):
        user = self.request.user
        if user.is_authenticated:
            if user is not None:
                if user.is_active and user.is_superuser:
                    return SubCategory.objects.all()
                raise PermissionDenied()
            raise PermissionDenied()
        raise PermissionDenied()
   

    serializer_class = SubCategorySerializer

【问题讨论】:

    标签: json django api django-rest-framework


    【解决方案1】:

    你应该看看filtering

    基本上,您可以在get_queryset() 中“手动”进行过滤

    def get_queryset(self):
        id_parent = self.request.query_params.get('id_parent')
        queryset = super().get_queryset()
        if id_parent:
            queryset = queryset.filter(id_parent=id_parent)
        return queryset
    

    或者使用第三方库如django-filter

    【讨论】:

      【解决方案2】:

      您可以像这样向viewset 添加自定义操作,假设您可以设置适当的网址/路由

      @action(detail=False, methods=['GET'])
      def get_sub_categories(self, request, *args, **kwargs):
          category_id = self.request.query_params.get("category_id", None)
          queryset = self.get_queryset()
          filtered_sub_categories = queryset.filter(id_parent=category_id)
      
          serializer = self.get_serializer(filtered_sub_categories, many=True)
          return Response(serializer.data)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-28
        • 1970-01-01
        • 2017-10-28
        • 2011-01-04
        • 2017-06-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多