Django rest framework Django Rest框架-在保存到数据库之前检查/操作数据(通过某种逻辑)

Django rest framework Django Rest框架-在保存到数据库之前检查/操作数据(通过某种逻辑),django-rest-framework,Django Rest Framework,我是Django Rest框架的新手。我有这样一个序列化程序: class ReviewSerializer(serializers.ModelSerializer): class Meta: model = Review fields = ( 'user', 'course', 'major', 'title', 'text',

我是Django Rest框架的新手。我有这样一个序列化程序:

class ReviewSerializer(serializers.ModelSerializer):
    class Meta:
        model = Review
        fields = (
            'user',
            'course',
            'major',
            'title',
            'text',
            'placements',
            'faculty',
            'infrastructure',
            'students',
            'extra_curricular',
            'passing_year',
        )
型号.py

class Review(models.Model):
    user = models.ForeignKey(to=User, related_name='reviews')
    course = models.ForeignKey(to=Course, related_name='reviews')
    major = models.ForeignKey(to=Major, related_name='reviews', blank=True, null=True)
    title = models.TextField(db_index=True)
    text = models.TextField(db_index=True)
    placements = models.FloatField(default=0.0)
    faculty = models.FloatField(default=0.0)
    infrastructure = models.FloatField(default=0.0)
    students = models.FloatField(default=0.0)
    extra_curricular = models.FloatField(default=0.0)
    passing_year = models.PositiveSmallIntegerField(default=2014)
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)
class ReviewViewSet(viewsets.ModelViewSet):
    """
    College API
    """
    queryset = Review.objects.all()
    serializer_class = ReviewSerializer
    paginate_by = 5
视图.py

class Review(models.Model):
    user = models.ForeignKey(to=User, related_name='reviews')
    course = models.ForeignKey(to=Course, related_name='reviews')
    major = models.ForeignKey(to=Major, related_name='reviews', blank=True, null=True)
    title = models.TextField(db_index=True)
    text = models.TextField(db_index=True)
    placements = models.FloatField(default=0.0)
    faculty = models.FloatField(default=0.0)
    infrastructure = models.FloatField(default=0.0)
    students = models.FloatField(default=0.0)
    extra_curricular = models.FloatField(default=0.0)
    passing_year = models.PositiveSmallIntegerField(default=2014)
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)
class ReviewViewSet(viewsets.ModelViewSet):
    """
    College API
    """
    queryset = Review.objects.all()
    serializer_class = ReviewSerializer
    paginate_by = 5

现在,每当我将某些内容发布到API时,如果验证成功通过,它就会直接保存到数据库中。我需要的是,在数据保存到数据库之前,我想使用一些业务逻辑检查并应用一些条件。这样,如果条件为true,则数据将被保存,否则它将向客户端返回错误消息。

您可以在ModelViewSet内重写默认的create方法。当您向API发布(post http方法)某些内容时,将调用此方法。 然后,您可以检查序列化数据是否有效,然后在保存它们之前应用业务逻辑:

class ReviewViewSet(viewsets.ModelViewSet):
    """
    College API
    """
    queryset = Review.objects.all()
    serializer_class = ReviewSerializer
    paginate_by = 5

    def create(self, request):
        serializer = ReviewSerializer(data=request.DATA)
        if serializer.is_valid():

            #YOUR CODE HERE

            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我假设您使用的是新版本3.0。然后,您需要将验证逻辑放入序列化程序
ReviewSerializer
(请参阅)

因此,如果要创建字段验证,应重载
def validate_u2;(self,value)
。例如,如果您希望
查看.placements
be
>=0.0
,您可以编写

类ReviewSerializer(serializers.ModelSerializer):
[...]
def验证位置(自身、值):
如果值>=0.0:
返回值
raise序列化程序。ValidationError('放置应为非负')
[...]
如果需要更高级的验证,例如验证两个相关字段,则需要覆盖
def validate(self,attrs)


例如,要在上创建_,我很抱歉没有首先提到我的DRF版本。它是2.4.3(我也对我的问题发表了评论)。顺便说一句,第一个答案解决了我的问题。无论如何,谢谢你。