【问题标题】:Django Rest Framework returning "detail": "Not found."Django Rest 框架返回“详细信息”:“未找到。”
【发布时间】:2018-02-13 21:47:18
【问题描述】:

当我尝试进行获取或部分更新时,我有一个 API 端点出现问题。我不确定我错过了什么,我已经在尝试中包含了代码以及它给出的错误。

错误:

“详细信息”:“未找到。”

据我了解,url 应该包含我想要部分更新的实例的 ID,因此执行 PATCH 的 url 是:

http://localhost:8000/manuscripts-api/manuscriptlibrary/9/

我的看法:

class ManuscriptLibraryViewSet(viewsets.ModelViewSet):
    """Handles creating, reading and updating manuscript library."""

    authentication_classes = (TokenAuthentication,)
    serializer_class = serializers.ManuscriptLibrarySerializer
    queryset = models.ManuscriptLibrary.objects.all()
    permission_classes = (permissions.PostOwnManuscriptLibrary,)

    def put(self, request, *args, **kwargs):
        return self.partial_update(request, *args, **kwargs)

我的模特:

class ManuscriptLibrary(models.Model):
    """Represents a single manuscript's library"""

    manuscript = models.OneToOneField(ManuscriptItem, on_delete=models.CASCADE)
    bookmarks = models.CharField(max_length=99999999)
    history = models.CharField(max_length=99999999)

    def __str__(self):
        """Django uses when it needs to convert the object to a string"""
        return str(self.manuscript)

我的序列化器:

class ManuscriptLibrarySerializer(serializers.ModelSerializer):
    """A serializer for a manuscript's library."""

    class Meta:
        model = models.ManuscriptLibrary
        fields = ('id', 'manuscript', 'bookmarks', 'history')

我的网址:

router = DefaultRouter()
router.register('manuscripts', views.ManuscriptViewSet, base_name="manuscripts")  # auto basename for models
router.register('manuscriptlibrary', views.ManuscriptLibraryViewSet, base_name="manuscript_library")
router.register('manuscriptsettings', views.ManuscriptSettingsViewSet)

urlpatterns = [
    url(r'', include(router.urls))
]

我的许可:

class PostOwnManuscriptLibrary(permissions.BasePermission):
    """Allow author to update a manuscript's library they own."""

    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True
        return obj.manuscript.author == request.user

    def has_permission(self, request, view):
        if request.method == 'POST':
            manuscript = request.data.get('manuscript')
            instance = ManuscriptItem.objects.get(pk=manuscript)
            return instance.author == request.user
        return True

附加信息:

网址:

http://localhost:8000/manuscripts-api/manuscriptlibrary/

返回:

[ { “身份证”:28, “手稿”:9, “书签”:“测试成功”, “历史”:“测试成功” } ]

【问题讨论】:

  • 可能是因为用户不是权限所有者PostOwnManuscriptLibrary
  • 我需要为方法更新或补丁扩展我的权限吗?
  • 当你用 pk 访问 url 就可以了,你会看到对象序列化器吗?
  • 不,我的 GET 也有问题!我更新了我的问题以提及这一点。获取:localhost:8000/manuscripts-api/manuscriptlibrary/9。结果:“详细信息”:“未找到。”
  • 为get http://localhost:8000/manuscripts-api/manuscriptlibrary/添加输出

标签: django django-models django-rest-framework django-views


【解决方案1】:

对于补丁和获取详细信息,您需要使用来自 id 的值,在您的情况下是 28,尝试转到路径并进行补丁

http://localhost:8000/manuscripts-api/manuscriptlibrary/28/

【讨论】:

  • 哇,这简直是天大的疏忽。再次感谢@bearbrown
  • 只是最后一个问题。此路径假定我知道库的 ID。我如何在我的 ManuscriptItem 模型中进入 ManuscriptLibrary 并获取 ManuscriptLibrary 实例的 ID,其中它们仅通过外键相关?
猜你喜欢
  • 2020-10-11
  • 2016-01-27
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 2016-07-01
相关资源
最近更新 更多