Django Rest Framework Api 查看 GET

Posted

技术标签:

【中文标题】Django Rest Framework Api 查看 GET【英文标题】:Django Rest Framework Api View GET 【发布时间】:2020-10-28 09:43:55 【问题描述】:

在我的代码中,我有一个模型推文,而在 tweet_list_view 中,我想将推文列表显示为 API 视图。

@api_view(['GET'])
def tweet_list_view(request, *args, **kwargs):
    qs = Tweet.objects.all().order_by('-date_posted')
    serializer = TweetSerializer(data=qs, many=True)
    return Response(serializer.data)

这就是我得到的结果。

AssertionError at /tweets/
When a serializer is passed a `data` keyword argument you must call `.is_valid()` before attempting to access the serialized `.data` representation.
You should either call `.is_valid()` first, or access `.initial_data` instead.

所以我调用了 .is_valid 方法,如下所示:

@api_view(['GET'])
def tweet_list_view(request, *args, **kwargs):
    qs = Tweet.objects.all().order_by('-date_posted')
    serializer = TweetSerializer(data=qs, many=True)
    if serializer.is_valid():
        return Response(serializer.data, status=201)
    return Response(, status=400)

然后我得到:

TemplateDoesNotExist at /tweets/
rest_framework/api.html

在 serializers.py 类 TweetSerializer(serializers.ModelSerializer): 元类: 模型 = 推文 fields = ['content', 'date_posted', 'likes']

models.py

class Tweet(models.Model):
    content = models.TextField(blank=True, null=True)
    image = models.FileField(upload_to='images/', blank=True, null=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)
    date_posted = models.DateTimeField(default=timezone.now)
    likes = models.IntegerField(default=0)

    def __str__(self):
        return self.content

    class Meta:
        ordering = ['-date_posted']

它正在寻找一个模板,但它应该使用默认的 Django 模板。有没有办法解决这个问题?

【问题讨论】:

是否将rest_framework 添加到INSTALLED_APPS 另外,您不需要使用 data 参数来序列化模型对象 【参考方案1】:

更新:

忘记了 api_view 前面的@。添加它。还添加了renderer_class(jsonrenderer)以确保避免错误。


只有当你有一个 post、put 或 patch 视图时,你才需要使用序列化器的 data 属性。在您的情况下,只需尝试不使用 data 属性就可以了

from rest_framework.renderers import JSONRenderer

@api_view(['GET'])
@renderer_classes([JSONRenderer]) 
def tweet_list_view(request, *args, **kwargs): 
    qs = Tweet.objects.all().order_by('-date_posted') 
    serializer = TweetSerializer(qs, many=True)
    return Response(serializer.data)

这里可以在官方django rest framework docs的教程示例中看到

【讨论】:

我使用了你的代码,但我得到了AssertionError at /tweets/.accepted_renderer not set on Response 能否请您添加您的模型和序列化程序? 我认为它与您的模型或序列化程序无关,您应该查看this 您可以尝试为基于函数的视图添加 renderer_class。这是通过添加 renderer_class 解决此问题的参考:https://***.com/a/55417280/13347371 那是同时 :D 我不经常使用基于函数的视图,这就是为什么我一开始没有注意到这一点。

以上是关于Django Rest Framework Api 查看 GET的主要内容,如果未能解决你的问题,请参考以下文章

django-rest-framework 和 swagger api 文档

Django REST Framework -- REST API 报错:403

如何为 django-rest-framework api 编写单元测试?

如何使用 Django-oauth-toolkit 使用 Django-rest-framework 测试 API 端点以进行身份​​验证

JSON:带有 django-rest-framework-json-api 和 JWT 的 API

Django REST Framework - API 身份验证 - 授权应用程序而不是用户