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

Python 将url添加到序列化程序上的API响应。序列化程序,python,django,serialization,django-rest-framework,Python,Django,Serialization,Django Rest Framework,我有一个带有以下文件的django应用程序 型号.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() from r

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

型号.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()
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)
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)
序列化程序.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()
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)
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)
在views.py中,我现在定义一个ViewSet来返回序列化结果。在这个类中,我定义了一个注释列表

视图.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()
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)
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\u absolute\u url',read\u only=True)
源代码在
Comment
类中未定义。然而,我不知道如何做到这一点。非常感谢您的帮助。

您需要在模型上定义一个,例如:

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

    def get_absolute_url(self):
        return reverse('name-of-view', kwargs={'pk': self.pk})
#app/models.py
从django.db导入模型
从django.url反向导入
类注释(models.Model):
email=models.EmailField()
content=models.CharField(最大长度=128)
created=models.DateTimeField(auto\u now\u add=True)
def get_绝对_url(自身):
返回反向('name-of-view',kwargs={'pk':self.pk})

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

感谢您的响应。但是,由于我的类不使用django db,我没有从
model.model
继承我的
类注释,而是从
对象继承。是否可以获取数据库以外对象的url?@jan seins:那么如何持久化评论?您也可以在对象上定义
get\u absolute\u url
,没有任何东西强制它成为模型,但是许多Django功能对于非模型不起作用。