Я хочу создать несколько объектов с одним отношением внешнего ключа

Мне нужно добавить несколько навыков для одного кандидата в одном запросе. Сейчас я получаю ошибку cannot assign multiple instances to skill models

class CandidateSkill(models.Model):
    candidate = models.ForeignKey(Candidate, on_delete=models.CASCADE,related_name="skills",)
    skills = models.ForeignKey("jobs.Skill", on_delete=models.CASCADE)

class CandidateSkillList(generics.ListCreateAPIView):
    serializer_class = CandidateSkillSerializer
    queryset = CandidateSkill.objects.all()

----------
class CandidateSkillSerializer(serializers.ModelSerializer):
    class Meta:
        model = CandidateSkill
        fields = ["id", "candidate", "skills"]

В файле models.py измените отношения многие-ко-многим, тогда вы сможете легко добавить несколько экземпляров

skills = models.ManyToManyField("jobs.Skill")

Существуют различные способы создания нескольких экземпляров модели с помощью Django Rest Framework, но это решение использует наборы представлений и переопределяет метод create.

from rest_framework import status, viewsets
from rest_framework.response import Response

class ThingViewSet(viewsets.ModelViewSet):

    # This view code provides both list and item create functionality

    queryset = CandidateSkill.objects.all()
    serializer_class = CandidateSkillSerializer

    def create(self, request, *args, **kwargs):
        # If the data is a list then many = True else many = False
        serializer = self.get_serializer(data=request.data, many=isinstance(request.data,list))
        # Raise an exception if data is not valid
        serializer.is_valid(raise_exception=True)
        
        self.perform_create(serializer)
        # Get the headers infos
        headers = self.get_success_headers(serializer.data)
        # Return the response
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

Вы можете разместить данные следующим образом :

[{'candidate': 2, 'skills': 5}, {'candidate': 1, 'skills': 1}]

Но убедитесь, что навыки и кандидат id существуют !

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