简体   繁体   English

Django Rest Framework多对多序列化未按预期工作

[英]Django Rest Framework many-to-many serialization is not working as expected

I dug into stackoverflow and couldn't find anything related to this error/mistake. 我进入了stackoverflow,找不到与此错误/错误相关的任何内容。

Well, I have this model: 好吧,我有这个模型:


class ChatRoom(models.Model):
    class Meta:
        app_label = 'chatbot'

    group = models.CharField(max_length=255)
    category = models.CharField(max_length=255)
    name = models.CharField(max_length=255)
    url = models.URLField()
    online = models.IntegerField(default=0)
    recaptcha_hash = models.TextField(null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    bots = models.ManyToManyField(MarkBot, through='ChatBot')

    def __str__(self):
        return '{0}/{1}/{2}'.format(self.group, self.category, self.name)

This serializer: 该序列化器:


class ChatRoomSerializer(ModelSerializer):
    bots = MarkBotSerializer(read_only=True, many=True, allow_null=True)

    class Meta:
        model = ChatRoom
        fields = ['group', 'category', 'name', 'url',
                  'online', 'recaptcha_hash', 'bots']
        read_only_fields = ['pk', 'created_at', 'updated_at']

My many-to-many (with "through") middle model is: 我的多对多(带有“通过”)中间模型是:


class ChatBot(models.Model):
    class Meta:
        app_label = 'chatbot'

    room_token = models.TextField()
    bot = models.ForeignKey(MarkBot, on_delete=models.CASCADE)
    chat_room = models.ForeignKey(ChatRoom, on_delete=models.CASCADE)

Finally, my APIview, that retrieves the data to the client: 最后,我的APIview将数据检索到客户端:

class ChatRoomsActive(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request, *args, **kwargs):
        user = request.user

        try:
            campaign = Campaign.objects.get(user=user, is_active=True)
            chat_rooms = ChatRoom.objects.filter(campaign=campaign)
            rooms = ChatRoomSerializer(
                data=list(chat_rooms.values()),
                many=True
            )

            if rooms.is_valid():
                return Response({
                    'data': rooms.data,
                    'error': None
                })

        except Campaign.DoesNotExist:
            return Response({
                'data': [],
                'error': 'Campanha inválida'
            }, status=status.HTTP_400_BAD_REQUEST)

        except Exception:
            return Response({
                'data': [],
                'error': 'Ocorreu um erro inesperado em sua requisição'
            }, status=status.HTTP_400_BAD_REQUEST)

        return Response({
            'data': [],
            'error': 'Não foi possível obter as salas ativas'
        }, status=status.HTTP_400_BAD_REQUEST)

And, in all my JSON serialized results I receive the attribute "bots" equals "null", even when I have a bot attached to a room. 而且,在我所有的JSON序列化结果中,即使我将机器人连接到房间,我也会收到属性“ bots”等于“ null”。

Expected Output 预期产量

A list of bots attached to that specific room or null if it has none. 附加到该特定房间的漫游器列表;如果没有,则为null。

Thank you, in advance! 先感谢您!

chat_rooms.values() is likely not to have the related bots and calling is_valid for serialization doesn't make sense - I'm not sure it works at all. chat_rooms.values()可能没有相关的bots并且调用is_valid进行序列化没有任何意义-我不确定它是否可以工作。

rooms = ChatRoomSerializer(
    instance=list(chat_rooms),
    many=True
)

return Response({
    'data': rooms.data,
    'error': None
})

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

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