首页 文章

DRF - 通过模型嵌套序列化m2m字段

提问于
浏览
1

我在DRF中使用带有直通模型的m2m字段 . 一切都工作正常,除了我尝试嵌套会员序列化器 .

models.py

class SweepStakes(models.Model):                                                          
    name = models.CharField(max_length=255)                                      

class Event(models.Model):                                                                       
    sweepstakes = models.ManyToManyField(SweepStakes, through='EventSweepStakesMembership')

class EventSweepStakesMembership(models.Model):                                  
    event = models.ForeignKey(Event, on_delete=models.CASCADE)                   
    sweepstakes = models.ForeignKey(SweepStakes, on_delete=models.CASCADE)       
    enabled = models.BooleanField(default=False)

serializers.py

class EventSweepStakesSerializer(serializers.ModelSerializer):                      
    name = serializers.ReadOnlyField(source='sweepstakes.name')                     

    class Meta:                                                                     
        model = EventSweepStakesMembership                                          
        fields = ('name', 'enabled',)

class EventSerializer(BaseTenantSerializer):                                                                     
    sweepstakes = EventSweepStakesSerializer(many=True, read_only=True)             

    class Meta:                                                                     
        model = Event                                                               
        fields = ('sweepstakes',)

此时,如果我将 EventSweepStakesMembership 模型和 EventSweepStakesSerializer 挂钩到视图中,我会得到我期望的结果,输出如下:

{"name": "thingy", "enabled" true}

但是,当我将 Event 模型和 EventSerializer 序列化程序挂钩到视图中时, sweepstakes 字段返回一个空字典而不是嵌套表示,如下所示:

{"sweepstakes": [{}]}

请注意,它不是一个空数组,换句话说它确实看到了相关的直通模型,但在显示时根本没有正确地序列化它 .

没有错误,它只是空的 . 我试过增加 Event 序列化器的 depth 无济于事 .

我错过了一些东西,甚至可能都错了吗?

谢谢!

1 回答

  • 1

    知道了,多亏了这个答案:

    https://stackoverflow.com/a/17263583/1366989

    这里缺少的元素是 EventSerializer 上的 source kwarg . 所以,它现在看起来像这样,并按预期工作:

    class EventSerializer(BaseTenantSerializer):                                                                
        sweepstakes = EventSweepStakesSerializer(                                    
            source='eventsweepstakesmembership_set', many=True, read_only=True       
        )
    

相关问题