Python 从ListAPIView Django 3.0 Rest框架返回自定义JSON响应

Python 从ListAPIView Django 3.0 Rest框架返回自定义JSON响应,python,django,django-rest-framework,Python,Django,Django Rest Framework,我已经使用DRF创建了一个API,它能够根据指定的URL模式列出和查看特定记录。例如: 关于请求: curl -v http://127.0.0.1:8000/get_details/120001/ 我能得到一个答复: [ { "subject": "Data Structures", "course": "CSE" }, { "subject": "Thermodynamics", "course": "

我已经使用DRF创建了一个API,它能够根据指定的URL模式列出和查看特定记录。例如:

关于请求:

curl -v http://127.0.0.1:8000/get_details/120001/
我能得到一个答复:

[
    {
        "subject": "Data Structures",
        "course": "CSE"
    },
    {
        "subject": "Thermodynamics",
        "course": "Chemistry"
    },
    {
        "subject": "Organic Chemistry",
        "course": "Chemistry"
    },
    {
        "subject": "Optics",
        "course": "Physics"
    }
]
其中“120001”是搜索数据库所依据的用户id。 但我希望得到以下格式的响应:

{'Chemistry': ['Thermodynamics', 'Organic Chemistry'], 'CSE': ['Data Structures'], 'Physics': ['Optics']}
就内容而言,我没有考虑缩进和其他因素

虽然我能够为如何创建和填充此字典的逻辑编写代码,但我无法确定如何将其作为响应返回以及从何处返回

我使用generics.ListAPIView作为视图类

这是我的models.py:

Serializer serializers.py:

对于默认格式的第一个输出,使用views.py:

我已经编写了一个逻辑,通过使用Subject.objects.values提取值来创建字典以作为响应发送,如所需输出中所述。。。。然后循环搜索结果来创建我的字典,但我不知道它在哪里,写在哪个函数中,从哪个函数返回

是否有generics.ListAPIView类提供的函数允许我执行此操作?如果没有,我还可以尝试其他的方法吗

我是Django的初学者,任何帮助都将不胜感激。此外,如果有人能向我推荐一个实用指南/教程/播放列表,我可以通过代码示例学习DRF,从而加快我的学习过程,这将非常有帮助

谢谢大家!

您需要重写序列化程序的to_表示方法

在某些情况下,您需要为 除了要序列化的对象之外,还有序列化程序


谢谢你!我可以通过编写自己的APIView类实现来解决这个问题,但我查阅了文档和几个to_表示的示例,它肯定会在将来派上用场:
class Subject(models.Model):
    user_id = models.CharField(null = False, max_length=10)
    subject = models.CharField(max_length=50)
    course = models.CharField(max_length=50)

    def __str__(self):
        return self.subject
class SubjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Subject
        fields = ['subject', 'course']
class SubjectView(generics.ListAPIView):
    serializer_class = SubjectSerializer

    def get_queryset(self):
        username = self.kwargs['user_id']
        return Subject.objects.filter(user_id = username).only('subject','course')
class SubjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Subject
        fields = ['subject', 'course']

    def to_representation(self, instance):
        data = super(SubjectSerializer, self).to_representation(instance)
        # manipulate data here 
        return data