DRF - 具有直通模型的 m2m 字段的嵌套序列化

Posted

技术标签:

【中文标题】DRF - 具有直通模型的 m2m 字段的嵌套序列化【英文标题】:DRF - Nested Serialization Of m2m fields with through model 【发布时间】:2017-10-26 13:03:34 【问题描述】:

我在 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)

序列化器.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】:

知道了,感谢这个答案:

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

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

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

【讨论】:

谢谢我的朋友。您很可能为我节省了几个小时,否则这些时间将用于挖掘 DRF 源代码..

以上是关于DRF - 具有直通模型的 m2m 字段的嵌套序列化的主要内容,如果未能解决你的问题,请参考以下文章

DRF中ManyToManyField的自定义序列化器和ViewSet [重复]

查询1:M相关模型DRF中的对象

通过 m2m 关系的直通表的值过滤 django 查询集

在模型DRF中序列化相关模型的字段

DRF:使用嵌套序列化程序的简单外键分配?

drf图片字段序列化完整路径