Как обновить существующее поле "многие ко многим" в Django REST?

У меня есть такая модель графика:

class Plot(models.Model):

garden = models.ForeignKey('perma_gardens.Garden', on_delete=models.CASCADE)
plant = models.ManyToManyField('perma_plants.Plant', related_name='%(class)s_plant', blank=True)

def __str__(self):
    return self.name

Содержит поле для растений в формате "многие ко многим".

В моей базе данных уже есть несколько созданных растений. И я хотел бы иметь возможность обновлять модель участка, добавляя в него растения по ID, я реализовал функцию partial_update в файле views.py, но когда я обновляю участок, добавляя в него растение на основе его ID, он сообщает мне, что: "Объект растения с этим пользовательским полем id уже существует"

Вот мой serializers.py файл :

class GardenSerializer(serializers.ModelSerializer):
    class Meta:
        model = Garden
        fields = ('id', 'name',)


class PlantSerializer(serializers.ModelSerializer):
    class Meta:
        model = Plant
        fields = ('custom_id', 'name', "category", 'image', 'facility_rate', 'sunshine_index', 'irrigation_index')
   
class WritePlotSerializer(WritableNestedModelSerializer, serializers.ModelSerializer):
    plant = PlantSerializer(many=True)

    class Meta:
        model = Plot
        fields = '__all__'

Вот мой views.py файл :

class PlotViewSet(viewsets.ModelViewSet):
    queryset = Plot.objects.all()

    def create(self, request, *args, **kwargs):
        serializer = WritePlotSerializer(data=request.data, many=isinstance(request.data, list))
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def partial_update(self, request, *args, **kwargs):
        instance = self.queryset.get(pk=kwargs.get('pk'))
        serializer = WritePlotSerializer(instance, data=request.data, partial=True)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data)

    def delete(self, request, pk):
        snippet = self.get_object(pk)
        snippet.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

    def get_serializer_class(self):
        if self.action in ("list", "retrieve"):
            return ReadPlotSerializer
        return WritePlotSerializer
Вернуться на верх