【问题标题】:Polymorphically serializing objects in django在 django 中多态序列化对象
【发布时间】:2019-04-12 13:25:40
【问题描述】:

我有以下对象继承模型。

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)

各自的Serializers如下,

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。 我不确定如何从父对象中确定子对象。

谁能帮帮我。

【问题讨论】:

    标签: python django django-orm


    【解决方案1】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-16
      • 2013-12-04
      • 2023-04-09
      • 1970-01-01
      • 2011-04-14
      • 2018-01-13
      • 1970-01-01
      相关资源
      最近更新 更多