修改django-rest中响应字段的最佳方式



我有一个串行器,它为这个数据提供

class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ('id', 'name', 'cost', 'currency')
class UserSerializer(serializers.ModelSerializer):
posts = PostSerializer(many=True)
class Meta:
model = User 
fields = ('id', 'name')

它给出这样的响应,

{
"id": 1,
"name": "joe",
"posts": [
{
"id": 20,
"name": "first post",
"cost": 20.00,
"currency": "USD"
},
{
"id": 21,
"name": "second post",
"cost": 30.00,
"currency": "USD"
}
]
}

然而,我想基于一些条件来更改/添加响应的字段,例如,如果成本低于25,则将其设为零,并为每个帖子添加一个折扣字段。

我就是这样做的。

class MyPostView(APIView):
def get(request):
query_set = User.objects.all()
user_and_posts = UserSerializer(query_set)
response_data = user_and_posts.data
# I am modifying the serializer data here :<
for post in response_data['posts']:
post['discount'] = 10 # some value
if post['cost'] < 25: 
post['cost'] = 0
return Response(serializer.data, status=status.HTTP_200_OK)

对我来说,像这样修改原始数据看起来不太对劲,在django-rest有其他方法可以做到这一点吗?或者使用序列化程序可以做得更好?

一般来说,更改我们从serializer和按照客户想要的方式格式化?在像Java这样的语言中,我们将为模型提供序列化程序,并为输出提供另一个序列化程序。。我可以做一些类似的事情吗?

如果它是与模型相关的东西,并且可以通过操纵模型变量来派生,我建议将属性添加到您的模型中

class Post(models.Model):
name = models.CharField(max_length=64)
cost = models.DecimalField(max_digits=8, decimal_places=2)
currency = models.CharField(max_length=3)
@property
def alternative_cost(self):
if self.cost < 25:
return 0
else:
return self.cost

然后,您必须将新创建的属性添加到序列化程序中。

最新更新