3

J'ai un point de terminaison API qui a un problème lorsque j'essaie de faire une mise à jour partielle ou partielle. Je ne suis pas sûr de ce qui me manque, j'ai inclus le code avec la tentative et l'erreur qu'il donne.Django Rest Framework renvoyant "detail": "Not found."

L'erreur:

"detail": "Not found."

Pour autant que je comprends l'URL doit inclure l'ID de l'instance je voudrais mettre à jour partiellement, de sorte que l'URL pour effectuer la PATCH sur est:

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

Mon point de vue:

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) 

Mon modèle:

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) 

Mon sérialiseur:

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

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

Mes urls:

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

Ma permission:

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 

Informations complémentaires:

Url:

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

Retours:

[ { "id": 28, "manuscript": 9, "bookmarks": "test success", "history": "test success" } ]

+1

il peut être parce que l'utilisateur n'est pas propriétaire par des autorisations 'PostOwnManuscriptLibrary' –

+0

ai-je besoin d'étendre mon autorisation pour une mise à jour de la méthode ou patch? – NewScientists

+1

quand vous obtenez juste sur l'URL avec pk est tout droit, et vous voyez le sérialiseur d'objet? –

Répondre

2

pour le patch et obtenir que vous devez utiliser des valeurs de id, dans votre cas c'est 28, essayez aller au chemin, et le patch

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

wow, c'était un sacré point de vue. merci encore @bearbrown – NewScientists

+0

juste dernière question. Ce chemin suppose que je connais l'ID de la bibliothèque. Comment puis-je dans mon modèle ManuscriptItem aller dans la ManuscriptLibrary et récupérer l'ID de l'instance ManuscriptLibrary où ils sont uniquement liés par une clé étrangère? – NewScientists