You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Django REST Framework API以按分类返回宠物数据?

实现方案:单API返回分组后的猫/狗数据

完全不用单独创建两个API!咱们可以在一个视图里直接返回你要的这种按猫、狗分组的结构,下面我给你一步步拆解实现步骤:

1. 确认(或调整)你的模型结构

首先假设你已经有一个记录丢失宠物的模型,里面需要有一个字段来区分猫和狗(比如pet_type),示例模型如下:

from django.db import models

class LostPet(models.Model):
    # 定义宠物类型选项
    PET_TYPES = (
        ('cat', 'Cat'),
        ('dog', 'Dog'),
    )
    pet_type = models.CharField(max_length=10, choices=PET_TYPES)
    description = models.TextField(blank=True)
    petName = models.CharField(max_length=100)
    # 手机号建议用CharField,避免IntegerField的精度问题和特殊字符限制
    phone = models.CharField(max_length=20)

2. 编写基础序列化器

先写一个序列化器来处理单条宠物数据的序列化,确保输出字段和你要的结构匹配:

from rest_framework import serializers
from .models import LostPet

class LostPetSerializer(serializers.ModelSerializer):
    class Meta:
        model = LostPet
        fields = ['id', 'description', 'petName', 'phone']

3. 编写视图实现分组逻辑

用APIView来自定义GET请求的处理,查询数据后按类型分组,最后返回你要的结构:

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import LostPet
from .serializers import LostPetSerializer

class CombinedLostPetView(APIView):
    def get(self, request):
        # 分别查询猫和狗的数据
        cats = LostPet.objects.filter(pet_type='cat')
        dogs = LostPet.objects.filter(pet_type='dog')
        
        # 序列化两组数据
        cats_data = LostPetSerializer(cats, many=True).data
        dogs_data = LostPetSerializer(dogs, many=True).data
        
        # 组装成目标结构返回
        return Response({
            'cats': cats_data,
            'dogs': dogs_data
        })

可选优化:单查询+分组

如果你不想分两次查询数据库,也可以先查询所有数据,再在内存里分组(适合数据量不大的场景),只需要给序列化器加上pet_type字段,然后分组时移除它:

# 修改序列化器,临时包含pet_type用于分组
class LostPetSerializer(serializers.ModelSerializer):
    pet_type = serializers.CharField()
    class Meta:
        model = LostPet
        fields = ['id', 'description', 'petName', 'phone', 'pet_type']

# 视图调整
class CombinedLostPetView(APIView):
    def get(self, request):
        all_pets = LostPet.objects.all()
        serialized_data = LostPetSerializer(all_pets, many=True).data
        
        grouped_data = {'cats': [], 'dogs': []}
        for pet in serialized_data:
            pet_type = pet.pop('pet_type')  # 移除不需要的字段
            if pet_type == 'cat':
                grouped_data['cats'].append(pet)
            elif pet_type == 'dog':
                grouped_data['dogs'].append(pet)
        
        return Response(grouped_data)

最后配置路由

记得在urls.py里给这个视图配置路由:

from django.urls import path
from .views import CombinedLostPetView

urlpatterns = [
    path('lost-pets/', CombinedLostPetView.as_view(), name='combined-lost-pets'),
]

这样访问/lost-pets/就能得到你想要的分组结构啦,完全不需要拆分两个API~

内容的提问来源于stack exchange,提问作者user8967235

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:04:43