简体   繁体   English

Django REST框架-自定义JSON

[英]Django REST Framework - Custom JSON

How do I serialize a list into a JSON object? 如何将列表序列化为JSON对象? The list combine 2 different models and looks like the following: 该列表结合了两种不同的模型,如下所示:

[<Room: 303 at 123 Toronto Street>, 
<Room: 305 at 123 Toronto Street>, 
<Room: 304 at 123 Toronto Street>, 
<SubvisitClinician: kchung>, 
<SubvisitClinician: pche>, 
<SubvisitClinician: mlo>]

I've created the RoomSerializer and SubvisitClinicianSerializer, but not sure to how finish it and implement it. 我已经创建了RoomSerializer和SubvisitClinicianSerializer,但是不确定如何完成并实现它。

class RoomSerializer(serializers.ModelSerializer):
    id = serializers.Field()  # Note: `Field` is an untyped read-only field.
    name = serializers.CharField(max_length=255)
    type = serializers.Field(source='type')
    clinic_location = serializers.Field(source='clinic_location')
    status = serializers.Field(source='status')
    url = serializers.CharField(max_length=100, default="room")

    class Meta:
        model = Room

class SubvisitClinicianSerializer(serializers.ModelSerializer):
    id = serializers.Field()
    subvisit = serializers.Field('subvisit')
    user = serializers.Field('user')
    primary = serializers.BooleanField()

    class Meta:
        model = SubvisitClinician

I wrote this quickly out of memory. 我很快就把它写满了。

Simple example: 简单的例子:

data1 = RoomSerializer(self.get_queryset(), many=True).data
data2 = SubvisitClinicianSerializer(self.get_queryset(), many=True).data
data_list = data1 + data2

You can write function which will iterate over list and call needed serializer based on type: 您可以编写函数以遍历列表并根据类型调用所需的序列化程序:

def serialize_list(data):
    return [RoomSerializer(i) if isinstance(i, Room) else SubvisitClinicianSerializer(i) for i in data]

Thanks for the response Alex. 感谢Alex的回复。 Managed to answer my own question after doing some more research. 经过更多研究后设法回答了我自己的问题。 Reiterated how the list was created and turned it into an object. 重申了如何创建列表并将其变成对象。 Created a RoomList class with rooms and subvisit_clinicians, then created a RoomListSerializer. 创建一个包含room和subvisit_clinicians的RoomList类,然后创建一个RoomListSerializer。 Code is below. 代码如下。

class RoomList(object):
    def __init__(self):
        super(RoomList, self).__init__()
        self.rooms = []
        self.subvisit_clinicians = []

    def add_room(self, room):
        self.rooms.append(room)

    def add_subvisit_clinician(self, subvisit_clinician):
        self.subvisit_clinicians.append(subvisit_clinician)

class RoomListSerializer(serializers.Serializer):
    rooms = RoomSerializer(many=True)
    subvisit_clinicians = SubvisitClinicianSerializer(many=True)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM