Создание данных полей "многие-ко-многим" в сериализаторе

Я пытаюсь отправить post запрос на создание объекта - курс, но каждый раз получаю ошибку, как мне написать сериализатор для класса - курс. Что мне нужно сделать, чтобы он создавал объект и в то же время отображал список контактов вместо списка ключей?

Модели:

class Category(models.Model):
    title = models.CharField(max_length=30)
    imgpath = models.CharField(max_length=100)

    def __str__(self):
        return self.title


class Branch(models.Model):
    latitude = models.CharField(max_length=250)
    longitude = models.CharField(max_length=250)
    address = models.CharField(max_length=250)

    def __str__(self):
        return self.address


class Contact(models.Model):

    class Type(models.IntegerChoices):
        PHONE = 1,
        FACEBOOK = 2,
        EMAIL = 3

    type = models.IntegerField(choices=Type.choices)
    value = models.CharField(max_length=250)

    def __str__(self):
        return self.value


class Course(models.Model):
    name = models.CharField(max_length=30)
    description = models.TextField()
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='category')
    logo = models.CharField(max_length=20, blank=True)
    contacts = models.ManyToManyField(Contact)
    branches = models.ManyToManyField(Branch, blank=True)

    def __str__(self):
        return self.name

Serializer:

from rest_framework import serializers

from application.category.models import Category, Branch, Contact, Course


class CategorySerializers(serializers.ModelSerializer):

    class Meta:
        model = Category
        fields = '__all__'


class BranchSerializer(serializers.ModelSerializer):

    class Meta:
        model = Branch
        fields = '__all__'


class ContactSerializer(serializers.ModelSerializer):

    class Meta:
        model = Contact
        fields = '__all__'


class CourseSerializer(serializers.ModelSerializer):

    class Meta:
        model = Course
        fields = '__all__'

    def create(self, validate_data):
        contacts_data = validate_data.pop('contacts')
        branchs_data = validate_data.pop('branches')
        contacts = []
        branchs = []
        course = Course.objects.create(**validate_data)
        # for contact_data in contacts_data:
        #     contact = Contact.objects.get(id=contact_data['id'])
        #     contacts.append(contact)
        # validate_data['contacts'] = contacts
        # return course
        for contact_data in contacts_data:
            print(contact_data)
            contact_id = contacts_data.pop('id')
            print(contact_id)
            contact = Contact.objects.get_or_create(id=contact_id, defaults=contact_data)

            contacts.append(contact)

        course.contacts.add(**contact)
        return course


    def to_representation(self, instance):
        rep = super().to_representation(instance)
        return rep

Просмотров:

class CategoryView(APIView):
    def get(self, request):
        category = Category.objects.all()
        serializer = CategorySerializers(category, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)



class BranchView(ListAPIView):
    queryset = Branch.objects.all()
    serializer_class = BranchSerializer


class ContactViewSet(viewsets.ModelViewSet):
    queryset = Contact.objects.all()
    serializer_class = ContactSerializer


class CourseListView(APIView):

    def get(self, request,  *args, **kwargs):
        course = Course.objects.all()
        serializer = CourseSerializer(course, many=True)
        return Response(serializer.data, status.HTTP_200_OK)


    def post(self, request):
        serializer = CourseSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors)


class CourseDetailView(APIView):

    def get_object(self, pk):
        try:
            return Course.objects.get(pk=pk)
        except Course.DoesNotExist:
            raise KeyError('ТААА-ШАААААA')


    def get(self, request, pk):
        course = self.get_object(pk)
        serializer = CourseSerializer(course)
        return Response(serializer.data)


    def delete(self, request, pk):
        course = self.get.get_object(pk)
        course.delete()
        return Response(f'{course} was deleted!', status=HTTP_204_NO_CONTENT)

Я получаю эту ошибку: enter image description here введите описание изображения здесь

Чтобы ответить на ваш первый вопрос:

Что нужно сделать, чтобы создавался объект и одновременно отображался список контактов, а не список ключей?

Похоже, что вы хотите создать курс и вернуть список контактов? Если это так, то вам нужно изменить код в запросе POST к курсу. Возможно, на что-то вроде:

def post(self, request):
        serializer = CourseSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()

            # Get courses to return them as response
            courses = Course.objects.all()
            courses_serializer = CourseSerializer(courses)
            return Response(courses_serializer.data)

        return Response(serializer.errors)

Немного странно делать запрос API на создание определенного объекта и возвращать объекты другого типа! Но выше описано, как вы примерно это сделаете, если это то, что нужно вашему приложению.

Для ошибки, с которой вы столкнулись, мне нужно больше информации, например, трассировка стека.

Вернуться на верх