Necesito obtener solo un objeto de producto en mi VeiwSet basado en un slug dado, busqué en los documentos, pero no puedo encontrar ninguna solución a este problema. También necesito obtener el slug de la ruta de la URL, pero tampoco sé cómo hacerlo. Obviamente, el siguiente código no funciona.
producto/serializadores.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")producto/vistas.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 = ProductSerializerproducto/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 le permite combinar ListView y DetailView en una sola vista. Por lo tanto, no necesita dos vistas diferentes para manejar ambas acciones.
Ahora, si desea usar slug en la URL en lugar de la id de forma predeterminada, solo tiene que especificar lookup_field en el serializador y la vista de esta manera:
serializadores.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'} }vistas.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)), ] Ahora puede consultar http://localhost:8000/ para la lista de productos y http://localhost:8000/product_slug para obtener detalles del producto con product_slug como slug. Más sobre Django ViewSets y enrutadores