【问题标题】:Django Restful API Design Validation LogicDjango Restful API 设计验证逻辑
【发布时间】:2018-07-14 22:13:43
【问题描述】:

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

验证逻辑是否应该包含在序列化程序创建中?这是不好的做法吗?我试图将验证逻辑移至 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)

【问题讨论】:

    标签: django rest django-models


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2017-01-02
      • 2014-11-15
      • 1970-01-01
      • 2018-12-19
      • 2020-08-18
      • 2014-07-04
      • 2017-07-15
      • 1970-01-01
      • 2014-12-08
      相关资源
      最近更新 更多