Полиморфно сериализованные объекты в Django - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть следующая модель наследования объектов.

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')

Теперь я хочу сериализовать эти данные в зависимости от типа комнаты. Таким образом, вместо использования RoomSerializer я хочу просмотреть список комнат, и если комната - ClubRoom, тогда используйте ClubRoomSerializer или LeagueRoomSerializer. Я не уверен, как определить дочерний объект от родительского.

Может ли кто-нибудь помочь мне с этим.

1 Ответ

0 голосов
/ 09 ноября 2018
class RoomSerializer(serializers.Serializer):
    def to_representation(self, instance):
        if isinstance(instance, LeagueRoom)
            serializer_class = LeagueRoomSerializer
        elif isinstance(instance, ClubRoom):
            serializer_class = ClubRoomSerializer
        return serializer_class(instance=instance).data

queryset = user.room_set.order_by('-last_activity')
serialized = RoomSerializer(queryset, many=True).data
...