DRF嵌套序列化器没有序列化数据



我正在尝试为API视图序列化相关模型。

class Dashboard(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
modified_at = models.DateTimeField(auto_now=True)
user = models.ForeignKey(IamUser, on_delete=models.CASCADE, related_name='dashboards')
title = models.CharField(max_length=100)
type = models.CharField(max_length=100)
position = models.IntegerField()
config = models.CharField(max_length=5000, blank=True, null=True)
class WidgetLayout(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
modified_at = models.DateTimeField(auto_now=True)
user = models.ForeignKey(IamUser, on_delete=models.CASCADE, related_name='widgets')
dashboard = models.ForeignKey(Dashboard, on_delete=models.CASCADE, related_name='widgets')
type = models.ForeignKey(Widget, on_delete=models.CASCADE)
position = models.IntegerField()
width = models.IntegerField()
config = models.CharField(max_length=5000, blank=True, null=True)

与以下序列化器

class WidgetLayoutSerializer(serializers.ModelSerializer):
class Meta:
model = WidgetLayout
fields = ['id', 'type', 'position', 'width', 'config']

class DashboardSerializer(serializers.ModelSerializer):
class Meta:
widgets = WidgetLayoutSerializer(many=True)
model = Dashboard
fields = ['id', 'title', 'position', 'config', 'type', 'widgets']

视图像这样调用序列化器:

dashboards = request.user.dashboards.all()
serializer = DashboardSerializer(dashboards, many=True)

预期的输出将是每个Dashboard的JSON序列化中的widget列表,然而,我只得到widget - id列表。我发现,如果我删除widgets = WidgetLayoutSerializer(many=True),结果是相同的,所以我怀疑,序列化器没有被正确使用或引用。我浏览了https://www.django-rest-framework.org/api-guide/relations/#example,试图找出任何不同之处,但没有找到。

将小部件的prefetch_related添加到视图中的.all()中没有任何区别。

depth=1不是很有用,因为我想显式地指定每个序列化器。

两个字段具有相同的related_name:

这绝对是不正确的
user = models.ForeignKey(IamUser, on_delete=models.CASCADE, related_name='widgets')
dashboard = models.ForeignKey(Dashboard, on_delete=models.CASCADE, related_name='widgets')

widgetsuser中移除

并且该字段应该是基类属性,而不是Meta类属性。

class DashboardSerializer(serializers.ModelSerializer):
widgets = WidgetLayoutSerializer(many=True)
class Meta:
model = Dashboard
fields = ['id', 'title', 'position', 'config', 'type', 'widgets']

其他的似乎都很好。

最新更新