Невозможно заставить вложенные сериализаторы показывать связанные данные с помощью фреймворка Django REST
По какой-то причине мои вложенные сериализаторы не отображают связанные данные. Я искал ответ в Интернете, но не смог найти ни одного ответа, который бы исправил эту проблему. Демо-приложения, которые я делаю с помощью вложенных сериализаторов, работают как ожидалось, но в моем основном приложении вложенные сериализаторы не отображают связанные данные.
Ниже приведен мой соответствующий код.
Вот что я получаю в json-ответе.
[
{
"id": 2,
"nickname": "My Favorite Restaurant",
"user": 2,
"location": 2
}
]
Из-за чего вложенные сериализаторы не отображаются должным образом?
Огромное спасибо за помощь.
Я создал демо-приложения, использующие вложенные сериализаторы, с успехом, но попытка воспроизвести это на моем основном приложении не работает. Я могу видеть внешние ключи в json-ответе, а опция "depth" показывает, что данные есть и модели настроены правильно. Я также пробовал добавить 'related_name' в свою модель, но безрезультатно.
Проблема связана с тем, как вы используете вложенную сериализацию. Поэтому вам следует изменить код внутри класса FavoriteLocationSerializer
следующим образом:
class FavoriteLocationSerializer(serializers.ModelSerializer):
location_details = LocationSerializer(source='location')
class Meta:
model = FavoriteLocation
fields = ['id', 'nickname', 'user', 'location', 'location_details']
Тип поля location -
ForeignKey
, которое представляет собой отношение многие-к-одному, в то время как вы добавляете флагmany=True
, который должен использоваться, если поле используется для представления отношения многие-ко-многим. (документация DDRF)Прочитайте документ Django о related_name, чтобы понять его использование.
Нет необходимости устанавливать
read_only=True
, потому что по умолчанию вложенные сериализаторы доступны только для чтения. ( документация DDRF)Вы должны использовать атрибут
source
, когда имя элемента, который вы хотите сериализовать, не совпадает с его именем внутри сериализатора модели.