Невозможно создать API из django rest_framework

Может ли кто-нибудь помочь мне? У меня не получается создать API с методами GET POST PUT DELETE. Также, когда я перехожу по этому url: "http://127.0.0.1:8000/api/packages/" я не вижу стандартное представление Django API. API моих пользователей работает нормально со всеми методами, но не с пакетами.

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

Это мой файл views.py, в котором я определяю свой 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)

проект urls.py

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

Serializers.py файл

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

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

Если я правильно понимаю вашу проблему, вы получаете ответ из представления packagesAPI, но он не оформлен так красиво, как в представлениях restframework по умолчанию.

Это потому, что вы создаете представление packagesAPI с нуля, не используя компоненты restframework, которые заставляют ответы выглядеть так, как они выглядят. В своем UserViewSet вы используете наборы представлений restframework, которые делают все это автоматически.

Попробуйте немного изменить ваш packagesAPI, чтобы интегрировать компоненты:

  1. Декорируйте ваши пакетыAPI с помощью декоратора api_view.
    from rest_framework.decorators import api_view
    
    ....
    
    @api_view(['GET', 'POST', 'PUT', 'DELETE'])
    @csrf_exempt
    def packagesAPI(request, id=0):
        ...
  1. Замените свой JsonResponse на класс Reponse из restframework, например:
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)
Вернуться на верх