Django - как «объединить» два сериализатора - PullRequest
0 голосов
/ 04 июня 2018

Я ищу, как написать один сериализатор, например: используя GET -> я даю 'uuid' -> ответ сервера - это только 'name', 'content', 'rating' используя POST -> я даю 'name','content', 'rating' -> serer ответ только что создан 'uuid' и 'time'.

Это моя модель обучения:

class Post(models.Model):
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=40)
    time = models.DateTimeField()
    content = models.TextField(max_length=250)
    rating = models.IntegerField(default=1)

Я учился создавать DjangoREST API от youtube, и учитель сказал, что лучше сделать один сериализатор для разных действий, например, когда метод «POST» вы получаете «uuid» и «время», но когда метод «GET» вы получаете «имя», «время»',' контент 'и' рейтинг '.Но на этом уроке он хочет показать его более простым способом, поэтому он сделал два сериализатора, в зависимости от метода:

class PostGetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = [
            'name',
            'time',
            'content',
            'rating'
        ]


class PostCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = [
            'uuid',
            'time',
        ]

Я знаю, что это всего лишь небольшой пример, но я надеюсь, что вы его получите.

Как я могу манипулировать данными запроса и ответа ОДНОГО сериализатора, зависит от метода?


РЕДАКТИРОВАНО, потому что я думаю, что это не ясно:

Я хочу что-тонапример:

Когда я создаю объект с помощью API, начальные данные JSON - это 'name', 'content' и 'rating' ... после этого запроса на создание объект был создан с помощью pk -> uuid и autoвремя и данные JSON.Я хочу получить ответные поля 'uuid' (pk) и 'time' (автоматическое время).

Но когда я использую GET с заголовком 'uuid' (чтобы получить конкретный объект) в ответ, я хочуиметь «имя», «контент», «рейтинг» и «время» без «uuid».

Все в одном сериализаторе.Это вообще возможно?Какой тип написания сериализаторов обычно используется программистами?Для каждого метода один сериализатор?или один большой конкретный сериализатор для одной модели.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Использовать только 1 сериализатор задайте поля, которые вы хотите, чтобы система заполняла только для чтения.http://www.django -rest-framework.org / api-guide / serializers / # поля, указывающие только для чтения

Всегда включайте поле UUID, даже при запросе по идентификатору.Это на самом деле не повредит ответу, и гарантирует, что каждая сущность непротиворечива, когда / где вы ее запрашиваете.

0 голосов
/ 04 июня 2018

На rest-framework Документация Я нашел следующий пример:

@api_view(['GET', 'PUT', 'DELETE'])
def snippet_detail(request, pk):
"""
Retrieve, update or delete a code snippet.
"""
    try:
        snippet = Snippet.objects.get(pk=pk)
    except Snippet.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        serializer = SnippetSerializer(snippet)
        return Response(serializer.data)

    elif request.method == 'PUT':
        serializer = SnippetSerializer(snippet, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
         snippet.delete()
         return Response(status=status.HTTP_204_NO_CONTENT)

Таким образом, вы можете легко настроить данные вашего ответа в зависимости от вашего запроса.

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