Как сериализовать несколько моделей в одном сериализаторе в Django?

Я пытаюсь объединить несколько сериализаторов в один, чтобы не делать многократную выборку на фронт-энде для одной и той же страницы. Похоже, что я должен использовать SerializerMethodField.

Мои взгляды довольно просты :

@api_view(['GET'])
def get_user_profile_by_name(request, name):
    try:
        user_profile = UserProfile.objects.get(display_name=name.lower())
        serializer = UserProfileSerializer(user_profile, many=False)
        return Response(serializer.data)
    except ObjectDoesNotExist:
        message = {'detail': 'User does not exist or account has been suspended'}
        return Response(message, status=status.HTTP_400_BAD_REQUEST)

Поскольку доступ к нему может получить анонимный пользователь, я не могу использовать request.user. Все модели, к которым я хочу получить доступ внутри UserProfileSerializer, связаны с UserProfile. Поэтому я не знаю, как настроить мой сериализатор. (У меня есть больше сериализаторов для объединения, но я ограничился одним сериализатором внутри сериализатора для примера)

class UserProfilePicture(serializers.ModelSerializer):
    class Meta:
        model = UserProfilePicture
        fields = '__all__'


class UserProfileSerializer(serializers.ModelSerializer):
    profile_picture = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = UserProfile
        fields = '__all__'

    def get_profile_picture(self, obj):
        # What to do here ?

Я пытаюсь понять, как получить доступ к объекту " user_profile " из UserProfileSerializer, чтобы запросить правильный объект UserProfilePicture и вернуть данные, объединенные внутри UserProfileSerializer.

Вы не показали свои модели и не описали отношения между UserProfile и UserProfilePicture. Но если картинка профиля является полем UserProfile один-к-одному, вы можете использовать дочерний сериализатор как поле родительского сериализатора:

class UserProfileSerializer(serializers.ModelSerializer):
    profile_picture = UserProfilePicture(source='profile_picture', read_only=True)
Вернуться на верх