Возврат пользовательского JSON ответа от ListAPIView Django 3.0 Rest Framework - PullRequest
0 голосов
/ 13 марта 2020

Я создал API с помощью DRF, который может отображать и просматривать определенные записи на основе указанного шаблона 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' - user_id, в базе данных выполняется поиск против. Но я хочу получить ответ в следующем формате:

{'Chemistry': ['Thermodynamics', 'Organic Chemistry'], 'CSE': ['Data Structures'], 'Physics': ['Optics']}

(по содержанию, я не рассматриваю отступы и другие факторы)

Хотя я могу написать код для логики c о том, как создать и заполнить этот словарь, Я не могу понять, как вернуть его в качестве ответа и откуда.

Я использую generics.ListAPIView как класс просмотра.

Вот моя модель (models.py):

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

Сериализатор (serializers.py):

class SubjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Subject
        fields = ['subject', 'course']

и, views.py (для первого вывода в формате по умолчанию):

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')

Я написал логи c для создания словаря для отправки в качестве ответа ( как описано в моем желаемом выводе) путем извлечения значений с использованием Subject.objects.values ​​(....) и последующим циклическим просмотром результатов для создания моего словаря, но я просто не понимаю, где (то есть в какую функцию) записать его и вернуться из.

Есть ли какая-либо функция, предоставляемая классом generics.ListAPIView, которая позволяет мне это делать? А если нет, то какой другой альтернативный подход я могу попробовать?

Я абсолютный новичок в Django, и любая помощь будет оценена. Кроме того, будет очень полезно, если кто-нибудь может предложить мне практическое руководство / учебное пособие / список воспроизведения, из которого я могу изучить DRF на примерах кода, чтобы ускорить процесс обучения.

Спасибо!

1 Ответ

1 голос
/ 13 марта 2020

Вам необходимо переопределить to_representation метод Serializer

из документов

В некоторых случаях необходимо предоставить дополнительный контекст для сериализатор в дополнение к сериализуемому объекту.

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
...