猿问

在 Django 中多态序列化对象

我有以下对象继承模型。


class Room:

    name = models.CharField(db_index=True, unique=True, max_length=255)

    status = models.CharField(default=RoomStatus.ACTIVE, max_length=256, null=True)

    members = models.ManyToManyField(User)

    last_activity = models.DateTimeField(default=timezone.now)

继承的模型是,


class LeagueRoom(Room):

    league = models.ForeignKey(League, on_delete=models.CASCADE, null=True)

    location = models.ForeignKey(Location, on_delete=models.CASCADE, null=True)

    logo_url = models.CharField(max_length=1024, null=True)


class ClubRoom(Room):

    club = models.ForeignKey(Club, on_delete=models.CASCADE, null=True)

    location = models.ForeignKey(Location, on_delete=models.CASCADE, null=True)

    logo_url = models.CharField(max_length=1024, null=True)

各自的序列化程序如下,


class RoomSerializer(serializers.ModelSerializer):

    members = UserSerializer(read_only=True, many=True)


    class Meta:

        model = Room

        fields = ('id', 'name', 'status', 'members', 'created', 'modified', 'last_active')


class LeagueRoomSerializer(serializers.ModelSerializer):

    location = LocationSerializer(read_only=True)

    league = LeagueSerializer(read_only=True)

    room = RoomSerializer(read_only=True)


    class Meta:

        model = LeagueRoom

        fields = ('id', 'name', 'location', 'status', 'league',

                  'logo_url', 'room', 'created', 'modified',)


class ClubRoomSerializer(serializers.ModelSerializer):

    location = LocationSerializer(read_only=True)

    club = ClubSerializer(read_only=True)

    room = RoomSerializer(read_only=True)


    class Meta:

        model = ClubRoom

        fields = ('id', 'name', 'location', 'club', 'logo_url',

                  'status', 'room', 'created', 'modified',)

我的问题是我已通过以下方式为用户获取了所有房间。


rooms = user.room_set.order_by('-last_activity')

现在我想根据房间类型序列化这些数据。因此,不是使用RoomSerializerI want 遍历房间列表,如果房间是 ClubRoom,则使用ClubRoomSerializeror else LeagueRoomSerializer。我不确定如何从父对象确定子对象。


有人可以帮我弄这个吗。


潇潇雨雨
浏览 140回答 1
1回答
随时随地看视频慕课网APP

相关分类

Python
我要回答