Django REST-隐藏反序列化的数据



我想在我的一个数据库字段中存储一些数据。在使用POST方法进行反序列化时,会将数据添加到该字段中。稍后,当我想用GET方法显示数据时,我不希望显示那个字段。

当我执行POST时,我反序列化该字符串:

{
"car_id": 3,
"rating": 3
}

稍后在views.py中,我在POST:时进行反序列化

@api_view(['POST'])
def car_rate(request):
if request.method == 'POST':
rate_data = JSONParser().parse(request)
rate_serializer = CarRateSerializer(data=rate_data)
if rate_serializer.is_valid():
try:
car_obj = Car.objects.get(pk=rate_data['car_id'])
except Car.DoesNotExist:
return JsonResponse({'message': 'The car with given ID does not exist!'}, status=status.HTTP_404_NOT_FOUND)

# check if rate is from 1 to 5
r = rate_serializer.validated_data['rating']
if int(r) >= 1 and int(r) <= 5:
rate_serializer.save()
return JsonResponse({'message':'The rate is in the scope!'})
else:
return JsonResponse({'message':'The rate is NOT in the scope!'})

return JsonResponse(rate_serializer.errors)

还有我的models.py:

class Car(models.Model):
make = models.CharField(max_length=15)
model = models.CharField(max_length=15)
avg_rating = models.FloatField(default=0)
def __str__(self):      # print it when Car instance is needed
return self.make

class CarRate(models.Model):
car_id = models.ForeignKey(Car, related_name='rates',
on_delete=models.CASCADE,
default=0)
rating = models.PositiveIntegerField(default=0)

代码确实有效(不知何故(。目前,使用POST方法可以为一辆车增加费率(多种费率(。我将费率存储在CarRate类中,稍后它将用于计算汽车的平均费率。我只是不想用GET打印出来。

这是我现在的输出:

{
"id": 2,
"make": "Volkswagen",
"model": "Golf",
"rates": [
4,
4,
2,
3
],
"avg_rating": 0.0
},

我只是希望rates字段在打印时不可见。

我读过defer()方法并尝试过,但什么也没发生。有什么帮助吗?

如果您绝对不希望该字段出现在数据库中,那么您可以简单地从Serializer字段选项中删除该字段(您将该字段命名为CarRateSerializer(但是,如果您希望它在数据库中,但又不希望它显示为输出,则可以在序列化程序类中使用extra_kwargs'write_only':True。我给你举一个我在项目中使用的例子

class TopicSerializer(serializers.ModelSerializer):
class Meta:
model = Topic
fields = ['id','title', 'totalMarks', 'status', 'categoryID']
extra_kwargs = {'categoryID': {'write_only': True}}

对于您的代码,您可以在CarRateSerializer 的类Meta中的fields下面添加这行代码

extra_kwargs = {'rating': {'write_only': True}}

我希望这能解决你的问题

只需从中删除rating字段,CarRateSerializer或者就可以为CarRate创建一个新的Serializer。

最新更新