Add serializers and viewsets in market app
This commit is contained in:
parent
5a7ee11e01
commit
4916baa732
64
market/serializers.py
Normal file
64
market/serializers.py
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
from rest_framework import serializers
|
||||||
|
from rest_framework.serializers import ModelSerializer
|
||||||
|
|
||||||
|
from market.models import (
|
||||||
|
Brand,
|
||||||
|
Product,
|
||||||
|
ProductColor,
|
||||||
|
ProductStorage,
|
||||||
|
Post,
|
||||||
|
Image,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class BrandSerializer(ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Brand
|
||||||
|
fields = "__all__"
|
||||||
|
|
||||||
|
|
||||||
|
class ProductColorSerializer(ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = ProductColor
|
||||||
|
fields = "__all__"
|
||||||
|
|
||||||
|
|
||||||
|
class ProductStorageSerializer(ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = ProductStorage
|
||||||
|
fields = "__all__"
|
||||||
|
|
||||||
|
|
||||||
|
class ProductSerializer(ModelSerializer):
|
||||||
|
colors = ProductColorSerializer(many=True, read_only=True)
|
||||||
|
storages = ProductStorageSerializer(many=True, read_only=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Product
|
||||||
|
fields = ("id", "name", "brand", "colors", "storages")
|
||||||
|
|
||||||
|
|
||||||
|
class ImageSerializer(ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Image
|
||||||
|
fields = ("image",)
|
||||||
|
|
||||||
|
|
||||||
|
class PostSerializer(ModelSerializer):
|
||||||
|
nickname = serializers.CharField(source="author.nickname")
|
||||||
|
images = ImageSerializer(many=True, read_only=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Post
|
||||||
|
fields = (
|
||||||
|
"id",
|
||||||
|
"product",
|
||||||
|
"color",
|
||||||
|
"storage",
|
||||||
|
"price",
|
||||||
|
"text",
|
||||||
|
"nickname",
|
||||||
|
"status",
|
||||||
|
"written_at",
|
||||||
|
"images",
|
||||||
|
)
|
71
market/viewsets.py
Normal file
71
market/viewsets.py
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
from rest_framework.decorators import action
|
||||||
|
from rest_framework.permissions import AllowAny, IsAdminUser, IsAuthenticated
|
||||||
|
from rest_framework.response import Response
|
||||||
|
from rest_framework.viewsets import ModelViewSet
|
||||||
|
|
||||||
|
from core.mixins import ActionBasedMixin
|
||||||
|
from core.permissions import IsAuthorOrReadOnly
|
||||||
|
from market.models import Brand, Product, Post
|
||||||
|
from market.serializers import (
|
||||||
|
BrandSerializer,
|
||||||
|
ProductSerializer,
|
||||||
|
PostSerializer,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class BrandViewset(ActionBasedMixin, ModelViewSet):
|
||||||
|
queryset = Brand.objects.all()
|
||||||
|
serializer_class = BrandSerializer
|
||||||
|
serializer_class_map = {
|
||||||
|
"products": ProductSerializer,
|
||||||
|
}
|
||||||
|
permission_classes = [IsAdminUser]
|
||||||
|
permission_classes_map = {
|
||||||
|
"list": [AllowAny],
|
||||||
|
"retrieve": [AllowAny],
|
||||||
|
}
|
||||||
|
|
||||||
|
@action(detail=True, methods=["GET"])
|
||||||
|
def products(self, request, pk):
|
||||||
|
brand = self.get_object()
|
||||||
|
serializer = self.get_serializer(brand.products.all(), many=True)
|
||||||
|
return Response(serializer.data)
|
||||||
|
|
||||||
|
|
||||||
|
class ProductViewset(ActionBasedMixin, ModelViewSet):
|
||||||
|
queryset = Product.objects.all()
|
||||||
|
serializer_class = ProductSerializer
|
||||||
|
serializer_class_map = {
|
||||||
|
"posts": PostSerializer,
|
||||||
|
}
|
||||||
|
permission_classes = [IsAdminUser]
|
||||||
|
permission_classes_map = {
|
||||||
|
"list": [AllowAny],
|
||||||
|
"retrieve": [AllowAny],
|
||||||
|
}
|
||||||
|
|
||||||
|
@action(detail=True, methods=["GET"])
|
||||||
|
def posts(self, request, pk):
|
||||||
|
product = self.get_object()
|
||||||
|
queryset = product.posts.all()
|
||||||
|
|
||||||
|
page = self.paginate_queryset(queryset)
|
||||||
|
if page is not None:
|
||||||
|
serializer = self.get_serializer(page, many=True)
|
||||||
|
return self.get_paginated_response(serializer.data)
|
||||||
|
|
||||||
|
serializer = self.get_serializer(queryset, many=True)
|
||||||
|
return Response(serializer.data)
|
||||||
|
|
||||||
|
|
||||||
|
class PostViewset(ActionBasedMixin, ModelViewSet):
|
||||||
|
queryset = Post.objects.all()
|
||||||
|
serializer_class = PostSerializer
|
||||||
|
permission_classes = [IsAuthenticated, IsAuthorOrReadOnly]
|
||||||
|
permission_classes_map = {
|
||||||
|
"list": [AllowAny],
|
||||||
|
"retrieve": [AllowAny],
|
||||||
|
}
|
||||||
|
|
||||||
|
def perform_create(self, serializer):
|
||||||
|
serializer.save(author=self.request.user)
|
Loading…
Reference in New Issue
Block a user