代码之家  ›  专栏  ›  技术社区  ›  JeremyE

创建具有两个“同级”模型的嵌套序列化程序

  •  1
  • JeremyE  · 技术社区  · 4 年前

    {
        name: John Doe,
        best_buy_price: 420,
        best_sell_price: 69,
        player_profile: {
            tsn_link: https://a_link.com
        }
        playerlistingadvanced: { # This is where I'm having the issue
            sales_minute: 7,
        }
    }
    

    我有三种型号。 playerProfile 成为“主要”模式和 playerListing playerListingAdvanced 连接到 玩家档案 通过一对一的关系。 playerPfofile 将有自己的端点,但我还想创建一个端点,主要是清单和高级清单数据(如上所示)。

    下面是model.py文件的精简版本:

    class PlayerProfile(models.Model):
        card_id = models.CharField(max_length=120, unique=True, primary_key=True)
        name = models.CharField(max_length=420, null=True)
        tsn_link = models.CharField(max_length=420, null=True)
       
     
    class PlayerListing(models.Model):
        player_profile = models.OneToOneField(
            PlayerProfile,
            on_delete=models.CASCADE,
            null=True)
        name = models.CharField(max_length=420, null=True)
        best_sell_price = models.IntegerField(null=True)
        best_buy_price = models.IntegerField(null=True)
    
    
    class PlayerListingAdvanced(models.Model):
        player_profile = models.OneToOneField(
            PlayerProfile,
            on_delete=models.CASCADE,
            null=True)
        sales_minute = models.DecimalField(max_digits=1000, decimal_places=2, null=True)
    

    这是我尝试过的serializer.py,但还没有开始工作。

    class PlayerListingAdvancedForNestingSerializer(serializers.ModelSerializer):
        class Meta:
            model = PlayerListingAdvanced
            fields = (
                'sales_minute',
                'last_week_average_buy',
                'last_week_average_sell',
            )
    
    class PlayerListingSerializer(serializers.ModelSerializer):
        player_profile = PlayerProfileForListingSerializer() # works
        playerlistingadvanced = PlayerListingAdvancedForNestingSerializer() #doesn't work
        
        class Meta:
            model = PlayerListing
            fields = (
                'name',
                'best_sell_price',
                'best_buy_price',
                'playerlistingadvanced',
                'player_profile'
            )
    

    1 回复  |  直到 4 年前
        1
  •  1
  •   kamilyrb    4 年前

    你可以用 SerializerMethodField . 你的假设是正确的。试试这个:

    class PlayerListingSerializer(serializers.ModelSerializer):
        player_profile = PlayerProfileForListingSerializer()
        playerlistingadvanced = serializers.SerializerMethodField() 
    
        class Meta:
            model = PlayerListing
            fields = (
                'name',
                'best_sell_price',
                'best_buy_price',
                'playerlistingadvanced',
                'player_profile'
            )
    
        def get_playerlistingadvanced(self, obj: PlayerListing):
            player_profile = obj.player_profile
            if hasattr(player_profile, 'playerlistingadvanced'):
                serializer = PlayerListingAdvancedForNestingSerializer(instance=player_profile.playerlistingadvanced)
                return serializer.data
            return None
    
    推荐文章