Детальный набор представлений для продукта в 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