python - DRF - 使用直通模型进行 m2m 字段的嵌套序列化

标签 python django m2m django-rest-framework

我在 DRF 中使用带有直通模型的 m2m 字段。一切工作正常,除了当我尝试嵌套成员资格序列化程序时。

模型.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 连接到 View ,我会得到我所期望的结果,输出如下:

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

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

{"sweepstakes": [{}]}

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

没有错误,只是空的。我尝试增加 Event 序列化器的深度,但无济于事。

我是否遗漏了什么,或者甚至可能做错了?

谢谢!

最佳答案

明白了,感谢这个答案:

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

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

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

关于python - DRF - 使用直通模型进行 m2m 字段的嵌套序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44187962/

相关文章:

Django Tastypie : Getting extra-values of a m2m relationships using intermediate model

Python Django(守护者): editing data depending on an m2m-field in my model

python - 使用 Python 订阅模式 Redis

python - 如何在Python中的字典中拥有两个键和一个值

python - 来自 Python 的带有 Wincrypt 的 Diffie-Hellman(到 RC4)

python - 跨多个文档的字符串搜索 - grep?

django - 使用 Django 发布到 Facebook/Twitter?

python - 相当于 PHP "echo something; exit();"与 Python/Django?

我们可以在 BG96 LwM2M 实现中添加自定义对象吗?

python - Django Admin - 显示 M2M 模型的中间字段