Django REST - 隐藏反序列化数据

Django REST - hide deserialized data

我想在我的数据库字段之一中存储一些数据。使用 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 class 中,稍后它将用于计算汽车的平均费率。我只是不想用 GET 打印出来。

这是我现在的输出:

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

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

我阅读了 defer() 方法并进行了尝试,但没有任何反应。有帮助吗?

只需删除 rating 字段,CarRateSerializer 您可以为 CarRate 创建一个新的序列化程序。

如果您绝对不希望该字段永远存在于您的数据库中,那么您只需从 Serializer 字段选项中删除该字段(您将其命名为 CarRateSerializer) 但是如果你希望它在你的数据库中但你不希望它显示为输出,你可以使用 extra_kwargs'write_only': True 在你的序列化器 class 中。我给你一个我在我的一个项目中使用的例子

class TopicSerializer(serializers.ModelSerializer):

class Meta:
    model = Topic
    fields = ['id','title', 'totalMarks', 'status', 'categoryID']
    extra_kwargs = {'categoryID': {'write_only': True}}

对于您的代码,您可以在 fields 下方的 class Meta 的 CarRateSerializer

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

希望这能解决您的问题