Django Restful API设计验证逻辑

时间:2018-07-14 22:13:43

标签: django rest django-models

在这里,我有一个端点来为用户创建媒体内容。端点可以工作,但是我感觉我的设计实现不正确。

序列化程序创建时是否应包含验证逻辑?这是不好的做法吗?我试图将验证逻辑移至 models.py ,但是在访问模型时遇到了问题,特别是这一行-self.model(user=user, category=category)

view.py

from rest_framework import status
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response

from .models import UserMedia
from .renderers import UserMediaSerializerJSONRenderer
from .serializers import UserMediaSerializer


class UserMediaCreateAPIView(APIView):
    permission_classes = (IsAuthenticated,)
    renderer_classes = (UserMediaSerializerJSONRenderer,)
    serializer_class = UserMediaSerializer

    def post(self, request):
        userMedia = request.data.get('userMedia', {})
        serializer = self.serializer_class(data=userMedia)
        serializer.is_valid(raise_exception=True)
        serializer.save(user=request.user, category=userMedia['category'])

        return Response(serializer.data, status=status.HTTP_201_CREATED)

serializers.py

from rest_framework import serializers

from .models import UserMedia


class UserMediaSerializer(serializers.ModelSerializer):
    category = serializers.CharField(allow_blank=False, required=True)

    class Meta:
        model = UserMedia
        fields = ('category',)
        read_only_fields = ('category',)

    def get_category(self, obj):
        if obj.category:
            return obj.category

        return 'N/A'

    def create(self, validated_data):
        if validated_data['user'] is None:
            raise TypeError('User media must have a user')

        if validated_data['category'] is None:
            raise TypeError('User media must have a category.')

        if validated_data['category'] not in dict(UserMedia.CATEGORY_CHOICES):
            raise TypeError('User media category is not available.')

        userMedia = UserMedia(**validated_data)
        userMedia.save()
        return userMedia

models.py

from django.db import models

class UserMedia(models.Model):
    user = models.ForeignKey('authentication.User', on_delete=models.CASCADE, related_name='media')

    MUSIC = 'M'
    VIDEO = 'V'
    CATEGORY_CHOICES = (
        (MUSIC, 'Music'),
        (VIDEO, 'Video'),
    )
    category = models.CharField(max_length=1, choices=CATEGORY_CHOICES, blank=False)

1 个答案:

答案 0 :(得分:1)

验证应在您的视图中完成。序列化程序应仅用于序列化数据。验证应在您的视图中完成,然后从您的视图中调用序列化程序。就此行self.model(user=user, category=category)而言,您似乎从未在任何地方导入用户。