我正在尝试为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')
将widgets
从user
中移除
并且该字段应该是基类属性,而不是Meta
类属性。
class DashboardSerializer(serializers.ModelSerializer):
widgets = WidgetLayoutSerializer(many=True)
class Meta:
model = Dashboard
fields = ['id', 'title', 'position', 'config', 'type', 'widgets']
其他的似乎都很好。