Django REST Framework如何隐藏GET接口返回的反序列化存储字段
问题根因说明
你使用defer不生效是因为defer是Django ORM层面用于跳过加载当前模型自身的数据库字段的方法,而你返回数据里的rates是CarRate表通过外键反向关联到Car模型的关联属性,不属于Car表的原生字段,所以ORM层面的defer不会对序列化输出的rates产生作用。
控制接口返回字段最直接的方案是调整Car模型对应的序列化器配置,以下是两种常见实现方式:
方案1:明确指定序列化器返回字段(最常用)
找到你返回Car数据的GET接口对应的CarSerializer,不要用fields = '__all__',改为显式声明需要返回的字段,自然就不会带出rates:
from rest_framework import serializers from .models import Car class CarSerializer(serializers.ModelSerializer): class Meta: model = Car # 只列出你需要返回给前端的字段,排除rates fields = ['id', 'make', 'model', 'avg_rating']
如果你不想逐个列字段,也可以用exclude直接排除不需要的rates字段:
class CarSerializer(serializers.ModelSerializer): class Meta: model = Car exclude = ['rates']
方案2:给显式定义的rates字段加write_only属性
如果你在CarSerializer里是主动声明了rates字段用于其他逻辑,又不想让它在返回时出现,可以给字段加write_only=True参数,序列化(即返回给前端)时会自动忽略该字段:
class CarSerializer(serializers.ModelSerializer): # 加write_only=True参数,仅反序列化(接收前端传参)时生效,序列化返回时不展示 rates = serializers.ListField(write_only=True) class Meta: model = Car fields = '__all__'
可选优化建议
你当前CarRate模型的外键字段命名为car_id不符合Django规范:Django会自动给外键字段追加_id作为数据库存储的列名,你当前的命名会导致数据库实际存储的字段变为car_id_id,建议改为car即可,related_name='rates'配置不变,不影响原有逻辑的使用:
class CarRate(models.Model): car = models.ForeignKey(Car, related_name='rates', on_delete=models.CASCADE, default=0) rating = models.PositiveIntegerField(default=0)
内容的提问来源于stack exchange,提问作者wolnio
相关产品推荐
相关产品推荐

