我正在搜索如何编写一个序列化程序,如: 使用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'。
全部在一个序列化程序中。它甚至可能吗? 程序员常用什么类型的写序列化器?每个方法一个序列化器?或者一个特定的序列化器用于一个型号。
答案 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字段。它并没有真正伤害到响应,它确保每个实体在你请求它的时间/地点都是一致的。