Детальный набор представлений для продукта в django rest framework

Мне нужно получить только один объект продукта в моем VeiwSet на основе заданного slug, я просмотрел документацию, но не могу найти никакого решения этой проблемы. Мне также нужно получить slug из url пути, но я не знаю, как это сделать. Очевидно, что приведенный ниже код не работает.

product/serializers.py

from rest_framework import serializers
from .models import Product

class ProductSerializer(serializers.ModelSerializer):
    image = serializers.ImageField(required=True)
    class Meta:
        model = Product
        fields = ("name", "description", "slug", "id", "price", "stock", "image", "category")

product/views.py

from django.http.response import JsonResponse
from rest_framework import serializers, viewsets
from rest_framework.response import Response
from django.http import JsonResponse
from .serializers import ProductSerializer
from .models import Product

class ProductViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.all().order_by('name')
    serializer_class = ProductSerializer

class ProductDetailViewSet(viewsets.ViewSet, slug):
    queryset = Product.objects.filter(slug=slug)
    serializer_class = ProductSerializer

product/urls.py

from rest_framework import routers, urlpatterns
from django.urls import path, include
from .views import ProductViewSet, ProductDetailiewSet

router = routers.DefaultRouter()
router.register(r'', ProductViewSet)


urlpatterns = [
    path('<str:slug>/',),
    path('', include(router.urls))
]

ViewSets позволяет объединить ListView и DetailView в одно представление. Таким образом, вам не нужно два разных представления для обработки обоих действий.

Теперь, если вы хотите использовать slug в url вместо id по умолчанию, вам просто нужно указать lookup_field в сериализаторе и представлении следующим образом :

serializers.py

class ProductSerializer(serializers.ModelSerializer):
    image = serializers.ImageField(required=True)
    class Meta:
        model = Product
        fields = ("name", "description", "slug", "id", "price", "stock", "image", "category")
        lookup_field = 'slug'
        extra_kwargs = {
            'url': {'lookup_field': 'slug'}
        }

views.py

class ProductViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.all().order_by('name')
    serializer_class = ProductSerializer
    lookup_field = 'slug'

urls.py

router = routers.DefaultRouter()
router.register(r'', ProductViewSet)

urlpatterns = [
    url(r'', include(router.urls)),
]

Теперь вы можете запросить http://localhost:8000/ для списка продуктов и http://localhost:8000/product_slug для детализации продуктов с product_slug в качестве slug. Подробнее о Django ViewSets and Routers

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