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