Django-如何合并'两个序列化程序

时间:2018-06-04 18:38:23

标签: python django rest serialization django-rest-framework

我正在搜索如何编写一个序列化程序,如: 使用GET - >我给'uuid' - >服务器响应只是' name',' content',' rating' 使用POST - >我提供了' name',' content',' rating' - > serer的回应刚刚创建了“uuid'和'时间'。

这是我的学习模式:

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)

我正在学习如何从youtube创建Django REST API,以及'老师'他说最好为不同的动作制作一个序列化器,例如" POST"你得到的方法' uuid'和'时间'但是当" GET"你得到的方法' name',' time',' content'和'评级'。 但是在这一课上他希望以更简单的方式展示它,所以他制作了两个序列化器,取决于方法:

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


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

我知道这只是一个小例子,但我希望你能得到它。

如何操作ONE序列化程序的请求和响应数据取决于方法?

EDITED因为我认为目前尚不清楚:

我想要这样的事情:

当我通过API创建对象时,初始JSON数据是' name',' content'并且'评级' ...在此创建请求之后,使用pk创建了对象 - > uuid和自动时间,以及json数据。我想得到回应' uuid' field(pk)和' time'字段(自动时间)。

但是,当我使用GET标题' uuid' (以获得特定对象)作为回应,我希望得到','内容','评分'和'时间'没有' uuid'。

全部在一个序列化程序中。它甚至可能吗? 程序员常用什么类型的写序列化器?每个方法一个序列化器?或者一个特定的序列化器用于一个型号。

2 个答案:

答案 0 :(得分:0)

在rest-framework documentation上,我找到了以下示例:

@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)

通过这种方式,您可以根据您的要求轻松自定义您的回复数据。

答案 1 :(得分:0)

仅使用1个序列化程序,将要填充系统的字段设置为只读。 http://www.django-rest-framework.org/api-guide/serializers/#specifying-read-only-fields

即使按ID请求,也始终包含UUID字段。它并没有真正伤害到响应,它确保每个实体在你请求它的时间/地点都是一致的。