Вложенный сериализатор 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']

Все остальное кажется мне хорошим.

Вернуться на верх