Remplacement de Django REST ViewSet avec une méthode de publication personnalisée et un modèle
J'ai un ModelViewSet
dans Django de REPOS d'un Cadre qui me donne la possibilité de faire un POST et OBTENIR par le biais de l'adresse suivante:
api/v1/users
Ces Utilisateurs ont une relation inverse à une table et j'aimerais être en mesure d'accéder à ces Commentaires par le biais de l'URL:
api/v1/users/<username>/comments
J'ai été capable de faire cela par la mise en place d'une coutume @detail_route
en remplaçant la queryset
et et serializer_class
mais il ne fonctionne que pour les requêtes GET. Si je tente de POSTER un nouveau commentaire à travers le RESTE du Cadre de la section admin, je reçois un avis d'erreur indiquant "'ListSerializer' objet n'est pas itératif"
Voici mon code:
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserFlat
lookup_field = 'username'
@detail_route(methods=['post','get'])
def comment(self, request, **kwargs):
user = self.get_object()
self.queryset = Comment.objects.filter(recipient=user.id)
self.serializer_class = CommentFlat
serializer = CommentFlat(instance=self.queryset, many=True)
return Response(serializer.data)
Le nouveau commentaire devrait prendre les paramètres suivants:
commentaire.auteur, commentaire.message, un commentaire.destinataire
Je peux entrer dans tous ces domaines dans le panneau d'admin et de tenter de créer une requête post, mais il échoue. Idéalement, je dois remplir un commentaire.des messages et commentaires.l'auteur et le commentaire.champ du destinataire doit être autopopulated avec l'utilisateur.id qui est obtenu dans l'url api/v1/users/<username>/comments
Personne ne sait pourquoi mon post n'est pas de remplir et comment je peux le remplissage automatique qu'un champ?
source d'informationauteur user2989731 | 2015-03-10
Vous devez vous connecter pour publier un commentaire.
J'ai tout compris. Pour ceux qui recherchent une réponse, la solution a été de définir de façon explicite les actions qui se produisent lorsque
request.method == 'POST'
et passer l'objet dans le sérialiseur.