Python 从ListAPIView Django 3.0 Rest框架返回自定义JSON响应
我已经使用DRF创建了一个API,它能够根据指定的URL模式列出和查看特定记录。例如: 关于请求: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": "
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