0

Can anyone please help me? I am not able to create API with GET POST PUT DELETE methods. Also when I go to this url: "http://127.0.0.1:8000/api/packages/" I cant see Django default API view. My users API is working fine with all methods but not packages.

Models.py

class Customer(models.Model):
    user = models.OneToOneField(
        User, null=True, blank=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=50, null=True)
    phone = models.CharField(max_length= 200, null = True)
    dob = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name


class Packages(models.Model):
    STATUS = (
    ('Drafts', 'Drafts'),
    ('Published', 'Published'),
    )
    name = models.CharField(max_length=50, null=True)
    details = models.CharField(max_length=200, null=True)
    price = models.PositiveIntegerField()
    days = models.CharField(max_length=10, null=True)
    nights = models.CharField(max_length=10, null=True)
    image = models.ImageField(null=True, blank=True)
    status = models.CharField(max_length=200, null=True, choices=STATUS)    
    def __str__(self):
        return self.name

Views.py

@csrf_exempt
def packagesAPI(request, id=0):
    if request.method == 'GET':
        packages = Packages.objects.all()
        packages_serializer = PackagesSerializer(packages, many=True) 
        return JsonResponse(packages_serializer.data,safe=False)

    elif request.method == 'POST':
        packages_data = JSONParser().parse(request)
        packages_serializer = PackagesSerializer(data = packages_data)
        if packages_serializer.is_valid():
            packages_serializer.save()
            return JsonResponse("Added Successfully",safe=False)
        return JsonResponse("Failed to Add",safe=False)
    
    elif request.method == 'PUT':
        packages_data = JSONParser().parse(request)
        packages = Packages.objects.get(package_id = packages_data['package_id'])
        packages_serializer = PackagesSerializer(packages,data = packages_data)
        if packages_serializer.is_valid():
            packages_serializer.save()
            return JsonResponse("Updated Successfully",safe=False)
        return JsonResponse("Failed to Update")
    
    elif request.method == 'DELETE':
        packages = Packages.objects.get(package_id=id)
        packages.delete()
        return JsonResponse("Deleted Successfully",safe=False) 

@csrf_exempt
def SaveFile(request):
    file = requestFILES['file']
    file_name = default_storage.save(file.name, file)
    return JsonResponse(file_name, safe=False)

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

This is my views.py file in which I define my API.

urls.py

router = routers.DefaultRouter()
router.register('users', UserViewSet) 
urlpatterns = [
    path('', include(router.urls)),
    path('packages/', views.packagesAPI),
    path('packages/<str:pk>', views.packagesAPI),
    path('packages/savefile/', views.SaveFile)
]+static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)

project urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('api.urls')),
    path('auth/', obtain_auth_token),
]

Serializers.py file

class CustomerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Customer
        fields = '__all__'   

class PackagesSerializer(serializers.ModelSerializer):
    class Meta:
        model = Packages
        fields = '__all__'   

1 Answer 1

1

If I understand your problem correctly you are getting a response from packagesAPI view but it is not styled as nicely as in the default restframework views.

This is because you are creating the packagesAPI view from scratch not using the restframework components which make the responses look as they do. In your UserViewSet you are using the restframework viewset which do all this automatically.

Try changing you packagesAPI slightly to integrate the components:

  1. Decorate you packagesAPI with the api_view decorator.
    from rest_framework.decorators import api_view
    
    ....
    
    @api_view(['GET', 'POST', 'PUT', 'DELETE'])
    @csrf_exempt
    def packagesAPI(request, id=0):
        ...
  1. Replace your JsonResponse with the Reponse class from the restframework, e.g:
from rest_framework.response import Response

...
    if request.method == 'GET':
        packages = Packages.objects.all()
        packages_serializer = PackagesSerializer(packages, many=True) 
        return Response(packages_serializer.data)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.