Как показать данные внешнего ключа в структуре отдыха Django? - PullRequest
0 голосов
/ 02 марта 2019

Модель:

class Demo(models.Model):
    name = models.CharField(max_length=255)
    desc = models.TextField()
    user = models.ForeignKey('auth.User', on_delete=models.CASCADE)

Сериализатор:

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

У меня есть форма на стороне внешнего интерфейса, куда я добавляю name, desc and assigning to User поэтому здесь я сталкиваюсь с проблемой.

Я передаю данные в API {name: "demo", desc: "lorem ipsum", user: 1 } Он работает при сохранении, но после сохранения возвращает тот же ответ, но я хочу, чтобы пользователь first_name, last_name, and email в ответном ответе.

Потому что у меня есть таблица, показывающая список содержимого демонстрационной таблицы.но всегда получаю только User ID не деталь пользователя.

Если я увеличиваю depth из Serializer Это создает проблему во время экономии, но при получении записей я получаю все детали модели User.Как и пароль в ответ, так что для меня это проблема безопасности, покажи все.

1 Ответ

0 голосов
/ 02 марта 2019

Вы можете разделить сериализатор Create и Retrieve.Например, создатель сериализатора будет тем, который вы используете в данный момент:

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

С другой стороны, Retrieve сериализатор выполнит сериализацию пользователя с другим сериализатором, используя Nested Relationship .

class DemoRetrieveSerializer(serializers.ModelSerializer):
    user = UserMinimalSerializer # or you could use your UserSerializer, see the last part of the answer
    class Meta:
        model = Demo
        fields = ('id', 'name', 'desc', 'user')
        read_only = ('id', 'name', 'desc', 'user',)

По вашему мнению, вы создадите данные с первым сериализатором и ответите вторым.Пример, использующий APIView:

class DemoView(APIView):
    def post(self, request, format=None):
        create_serializer = DemoCreateSerializer(data=request.data)
        if create_serializer.is_valid():
            instance = create_serializer.save()
            retrive_serializer = DemoRetrieveSerializer(instance)
            return Response(retrive_serializer.data, status=status.HTTP_201_CREATED)
        return Response(create_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Для достижения этого может потребоваться настройка представлений DRF, т. Е. Для Общих представлений .

Поскольку вы этого не делаетеЕсли вы хотите включить все поля модели User, вам придется написать минимальное представление User с использованием другого сериализатора.

class UserMinimalSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'first_name', 'last_name', 'email')
        read_only = ('id', 'first_name', 'last_name', 'email',)

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...