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}}
希望这能解决您的问题
我想在我的数据库字段之一中存储一些数据。使用 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}}
希望这能解决您的问题