【问题标题】:Django REST Framework - View with serialization without modelDjango REST Framework - 没有模型的序列化视图
【发布时间】:2016-11-29 08:30:40
【问题描述】:

我最近才开始为 Django 进行开发,并正在使用 Django REST 框架和基于类的视图构建一个 API。我正在寻找一种方法来组合模型,根据时间对它们进行排序,然后将字段的子集返回到附加表名的 API。

目前我有以下:

views.py

class RunLog(APIView):
        """
        List log for a specific run sorted in reverse chronological order
        """
        def get(self, request, run_id, format=None):
            # Combine and sort based on time (decreasing) 
            result_list = sorted(chain(Output.objects.filter(run=run_id),
                                       Downtime.objects.filter(run=run_id)), 
                                key=attrgetter('start_time'), reverse=True)

            // Replace this with serializer??
            response = Response(serializers.serialize('json', result_list), status=status.HTTP_200_OK)
            return response

models.py

class Output(models.Model):
    start_time = models.DateTimeField(default=datetime.now)
    value = models.FloatField()

    run = models.ForeignKey(Run, blank=True, null=True)

    def __unicode__(self):
        return str(self.id)

class Downtime(models.Model):
    start_time = models.DateTimeField(default=datetime.now)
    end_time = models.DateTimeField(null=True, blank=True)
    reason = models.CharField(max_length=500)

    run = models.ForeignKey(Run, blank=True, null=True)

我得到以下 JSON:

"[{\"model\": \"app.downtime\", \"pk\": 91, \"fields\": {\"start_time\": \"2016-07-20T14:46:21Z\", \"end_time\": null, \"reason\": \"reason1\", \"run\": 71}}, {\"model\": \"app.downtime\", \"pk\": 101, \"fields\": {\"start_time\": \"2016-07-20T14:46:21Z\", \"end_time\": null, \"reason\": \"reason2\", \"run\": 71}}]"

我想将此数据序列化为以下 JSON 格式:

    [
        {
            "id": 231,
            "type": "speed",
            "description": "Some description",
            "time": "2016-07-21T21:26:26Z"
        }
    ]

**Where type is the database table and description is concatenated columns from a model.

我查看了文档和 this similar question,但没有任何运气。

【问题讨论】:

  • 可以通过ModelObj._meta.db_table访问DB表名。
  • 我遇到的最大问题是能够按照我想要的方式格式化数据。能够从模型中获取一些字段(使用 values())并将它们推送到新的字段名称中,添加更多字段(即通过 ModelObj._meta.db_table 的表名),然后将其作为响应发送。
  • def your_serializer(obj): return dict(id=obj.id, type="type", ...)?

标签: python json django django-rest-framework


【解决方案1】:

正如 IanAuld 在 cmets 中建议的那样 - ModelObj._meta.db_table 获得了表的名称。然后我在 views.py 中创建了一个排序的字典列表:

speedList = Speed.objects.filter(run=run_id)
type = Speed._meta.db_table.split('_', 1)[1]
type = type[0].upper() + type[1:]

for speed in speedList:
    description = "Speed change to %.2f (units)" % speed.value
    logList.append({'id':speed.id, 'type':type, 'description':description, 'time':speed.start_time})

# Sort list by decreasing time
resultList= sorted(logList, key=itemgetter('time'), reverse=True)

serializer = LogSerializer(resultist, many=True)
return Response(serializer.data)

serializers.py:

class LogSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    type = serializers.CharField(max_length=100)
    description = serializers.CharField(max_length=500)
    time = serializers.DateTimeField()

【讨论】:

    猜你喜欢
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    相关资源
    最近更新 更多