Вложенный сериализатор 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)
Ожидаемым результатом будет список виджетов в их JSON сериализации для каждого Dashboard, однако я получаю только список Widget-IDs. Я обнаружил, что если я удалю widgets = WidgetLayoutSerializer(many=True)
, результат будет таким же, поэтому я подозреваю, что сериализатор не используется или не ссылается должным образом. Я просмотрел https://www.django-rest-framework.org/api-guide/relations/#example и попытался найти разницу, но не смог ее обнаружить.
Добавление prefetch_related для виджетов в .all() в представлении не дало никакого результата.
depth=1 не очень полезно, так как я хочу явно указать каждый сериализатор.
Это определенно неправильно, что 2 поля имеют одинаковое 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']
Все остальное кажется мне хорошим.