Сериализация моделей полиморфно в Django - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть такая модель наследования,

Базовый класс,

class PrivateMessage(Base):
    sender = models.ForeignKey(User, related_name='privatemessage_set', on_delete=models.CASCADE, null=True)
    room = models.ForeignKey(PrivateRoom, on_delete=models.CASCADE, related_name='message_set', null=True)
    message_type = models.CharField(max_length=255, null=True)

Дети.

class PrivateTextMessage(PrivateMessage):
        body = models.TextField(null=True, blank=True)

class PrivateImageMessage(PrivateMessage):
        image = models.ImageField(upload_to=attachment_images_path, null=True, blank=True)

Я их сериализую полиморфно,

class PublicMessageSerializer(serializers.ModelSerializer):
    class Meta:
        model = PublicMessage
        fields = '__all__'

    def to_representation(self, obj):
        if isinstance(obj, PublicTextMessage):
            return PublicTextMessageSerializer(obj, context=self.context).to_representation(obj)
        elif isinstance(obj, PublicImageMessage):
            return PublicImageMessageSerializer(obj, 
        return super(PublicMessageSerializer, self).to_representation(obj)


class PublicTextMessageSerializer(serializers.ModelSerializer):
    sender = UserSerializer(read_only=True)
    receiver = RoomSerializer(read_only=True)

    class Meta:
        model = PublicTextMessage
        fields = ('id', 'sender', 'receiver', 'body', 'message_type', 'created', 'modified',)


class PublicImageMessageSerializer(serializers.ModelSerializer):
    sender = UserSerializer(read_only=True)
    receiver = RoomSerializer(read_only=True)
    image = serializers.ImageField(use_url=True)

    class Meta:
        model = PublicImageMessage
        fields = ('id', 'sender', 'receiver', 'image', 'message_type', 'created', 'modified',)

Проблема заключается в том, что сериализатором отображаются только те поля, которые есть в базовом классе.Например, поле изображения в PublicImageMessage никогда не отображается.

Может ли кто-нибудь помочь мне с условным отображением, при котором отображаются все поля класса.

PS: классы имеютPublicMessageType объект.Я пытался использовать это и сериализовать, но за исключением того, что это неуклюже, в этом случае поля отображаются с нулевым значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...