DRF - 使用直通模型的 m2m 字段的嵌套序列化
DRF - Nested Serialization Of m2m fields with through model
我在 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
字段 returns 是一个空字典而不是嵌套表示,例如所以:
{"sweepstakes": [{}]}
请注意,它不是一个空数组,换句话说,它确实看到了相关的直通模型,只是在显示时没有正确序列化它。
没有错误,只是空的。我试过增加 Event
序列化程序的 depth
无济于事。
我是不是遗漏了什么,或者甚至可能做错了?
谢谢!
知道了,多亏了这个回答:
这里缺少的元素是 EventSerializer
上的 source
kwarg。所以,它现在看起来像这样,并且按预期工作:
class EventSerializer(BaseTenantSerializer):
sweepstakes = EventSweepStakesSerializer(
source='eventsweepstakesmembership_set', many=True, read_only=True
)
我在 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
字段 returns 是一个空字典而不是嵌套表示,例如所以:
{"sweepstakes": [{}]}
请注意,它不是一个空数组,换句话说,它确实看到了相关的直通模型,只是在显示时没有正确序列化它。
没有错误,只是空的。我试过增加 Event
序列化程序的 depth
无济于事。
我是不是遗漏了什么,或者甚至可能做错了?
谢谢!
知道了,多亏了这个回答:
这里缺少的元素是 EventSerializer
上的 source
kwarg。所以,它现在看起来像这样,并且按预期工作:
class EventSerializer(BaseTenantSerializer):
sweepstakes = EventSweepStakesSerializer(
source='eventsweepstakesmembership_set', many=True, read_only=True
)