将 url 添加到序列化程序上的 API 响应.序列化程序



我有一个带有以下文件的 django 应用程序

models.py

from datetime import datetime
class Comment(object):
def __init__(self, email, content, created=None):
self.email = email
self.content = content
self.created = created or datetime.now()

serializers.py

from rest_framework import serializers
class CommentSerializer(serializers.Serializer):
email = serializers.EmailField()
content = serializers.CharField(max_length=200)
created = serializers.DateTimeField()
url = serializers.CharField(source='get_absolute_url', read_only=True)

views.py 我现在定义了一个视图集来返回序列化的结果。在此类中,我定义了一个注释列表

views.py

from rest_framework import viewsets
from .serializers import *
from .models import Comment
from rest_framework.response import Response

class CommentViewSet(viewsets.ViewSet):
lc = [Comment(email='jan@auto.com', content='hallo mike'),
Comment(email='jan@auto.com', content='hallo jan'),
Comment(email='jan@auto.com', content='hallo niklas')]
def list(self, request):
serializer = CommentSerializer(self.lc, many=True)
return Response(serializer.data)
def retrieve(self, request, pk=None):
user = self.lc[int(pk)]
serializer = CommentSerializer(user)
return Response(serializer.data)

当我现在调用 api (http://127.0.0.1:8000/comments/?format=json( 时,我得到以下结果

[
{
"email": "jan@auto.com",
"content": "hallo mike",
"created": "2019-08-16T16:53:56.371890Z"
},
{
"email": "jan@auto.com",
"content": "hallo jan",
"created": "2019-08-16T16:53:56.371890Z"
},
{
"email": "jan@auto.com",
"content": "hallo niklas",
"created": "2019-08-16T16:53:56.371890Z"
}
]

在此响应中,我希望看到每个数据集的 URL。错误可能是url = serializers.CharField(source='get_absolute_url', read_only=True)源代码在Comment类中未定义。但是我不知道如何实现这一目标。任何帮助,不胜感激。

你需要在你的模型上定义一个get_absolute_url方法[Django-doc],比如:

# app/models.py
from django.db import models
from django.urls import reverse
class Comment(models.Model):
email = models.EmailField()
content = models.CharField(max_length=128)
created = models.DateTimeField(auto_now_add=True)
defget_absolute_url(self):
returnreverse('name-of-view', kwargs={'pk': self.pk})

这里'name-of-view'是您定义的视图的名称,例如在您的urls.py中,并且kwargs=...被赋予一个字典,该字典映射了相应URL路径参数的值。

最新更新