Django rest framework Django Rest框架-在保存到数据库之前检查/操作数据(通过某种逻辑)
我是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',
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(我也对我的问题发表了评论)。顺便说一句,第一个答案解决了我的问题。无论如何,谢谢你。