我正在使用Django restframework做一些事情。现在非常基本,但是我希望数据返回给我的方式有所不同。
这是我现在得到回复的方式:
[
{
"line": "line1",
"user_text": "Some text",
"topic": "value/xrp"
},
{
"line": "line2",
"user_text": "Some text 2",
"topic": "beer/heineken/sale"
}
]
这就是我想要得到的:
{
"line1": {
"user_text": "Some text",
"topic": "value/xrp"
},
"line2": {
"user_text": "Some text 2",
"topic": "beer/heineken/sale"
}
}
这是我的序列化器:
class LineSerializer(serializers.Serializer):
line = serializers.CharField(max_length=16)
user_text = serializers.CharField(max_length=16)
topic = serializers.CharField()
这是视图
class DisplayDetailAPIView(ListAPIView):
serializer_class = LineSerializer
def get_queryset(self):
return Line.objects.filter(display__serial_number=self.kwargs['serial_number'])
和模型(作为参考)
class Line(models.Model):
display = models.ForeignKey(Display, on_delete=models.CASCADE, related_name='lines')
line = models.CharField(max_length=16)
user_text = models.CharField(max_length=16, null=True, blank=True)
topic = models.ForeignKey(Topic, on_delete=models.CASCADE, blank=True, null=True)
def __str__(self):
return self.line
我查看了其余框架文档以及一些关于stackoverflow的信息,但还没有找到答案。
如果有人对我有暗示,将不胜感激:)
答案 0 :(得分:0)
您可以在序列化程序类中覆盖to_representation
:
class LineSerializer(serializers.ModelSerializer):
class Meta:
model = Line
fields = ('user_text', 'topic')
def to_representation(self, instance):
data = super().to_representation(instance)
response_data = {}
response_data[instance.line] = data
return response_data
您只需创建一个 temporary 数据字典,然后将当前实例line
属性指定为JSON响应的键-最终您实际上想要的是:
[
{
"line1": {
"user_text": "lorem ipsum",
"topic": ...
}
},
{
"line2": {
"user_text": "dolor sin amet",
"topic": ...
}
}
]
注释1 :在这种特殊情况下,您可能希望使用ModelSerializer
而不是Serializer
,我认为它更易于使用,您可以访问{{ 1}},而无需指定它实际要序列化。
注释2 :在这里,您的instance.line
字段将被序列化为topic
,因为它是数据库级别的id
关系。如果要从实际主题的一个字段中将ForeignKey
序列化为topic
,请查看here。