Ce base_name paramètre dois-je besoin dans mon itinéraire pour faire de ce Django API de travail?
Je suis la construction d'une application Django qui expose une API REST permettant aux utilisateurs de requête de mon application de modèles. Je suis en suivant les instructions ici.
Mon Parcours ressemble à ceci dans myApp de l'url.py:
from rest_framework import routers
router = routers.DefaultRouter() router.register(r'myObjects/(?P<id>\d+)/?$', views.MyObjectsViewSet)
url(r'^api/', include(router.urls)),
Mon Modèle ressemble à ceci:
class MyObject(models.Model):
name = models.TextField()
Mon Sérialiseur ressemble à ceci:
class MyObjectSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = MyObject
fields = ('id', 'name',)
Mon Viewset ressemble à ceci:
class MyObjectsViewSet(viewsets.ViewSet):
def retrieve(self,request,pk=None):
queryset = MyObjects.objects.get(pk=pk).customMyObjectList()
if not queryset:
return Response(status=status.HTTP_400_BAD_REQUEST)
else:
serializer = MyObjectSerializer(queryset)
return Response(serializer.data,status=status.HTTP_200_OK)
Quand j'ai frappé /api/myObjects/60/j'obtiens l'erreur suivante:
base_name
argument n'est pas spécifié, et ne pouvait pas déterminer automatiquement le nom de la viewset, car il ne dispose pas d'un.model
ou.queryset
attribut.
Je comprends de ici que j'ai besoin d'un base_name paramètre sur ma route. Mais à partir de la documentation, il est clair pour moi ce que la valeur de cette base_name paramètre doit être. Quelqu'un peut-il me dire en quoi le parcours devrait ressembler à la base_name?
- Une question similaire (faite aussi par @Saquib Ali) a été répondu here portant sur le même problème.
Vous devez vous connecter pour publier un commentaire.
Essayez de faire cela dans votre urls.py. Le troisième paramètre "Personne" peut être tout ce que vous voulez.
Peut-être vous avez juste besoin de mettre le
base_name
paramètre de votre routeur avec le nom de l'objet:MyObject
, dans votre cas.http://www.django-rest-framework.org/api-guide/routers/#Usage
Laissez-moi vous expliquer pourquoi nous avons besoin d'un base_name en premier lieu, puis nous allons aller dans la valeur possible de base_name.
Si vous avez déjà utilisé le Django url sans le reste-cadre (DRF) avant, vous avez spécifié comme ceci:
Ici, si vous le voyez, il y a un nom paramètre qui est utilisé pour identifier l'url dans la actuel espace de noms (qui est d'application).
C'est exactement ce que django-repos-cadre d'essayer de le faire automatiquement, depuis le drf sait si la vue est liste ou détail (en raison de viewset). il a juste besoin de l'ajout de certains préfixe de différencier les url. C'est le but de base_name (préfixe).
Dans la plupart des cas, vous pouvez donner le url ou nom de la ressource comme base_name. Dans votre cas, base_name=monobjet. DRF va générer base_name + view_type comme le nom paramètre comme la myobject_list & myobject_detail.
Note: Généralement, base_name sera automatiquement obtenu à partir de la queryset champ (de la vue), puisque c'est de même pour tous les types de vues dans un viewset. Mais si vous spécifiez, get_queryset méthode au lieu de queryset, il est possible que vous avez différents queryset pour les différents types d'affichage (liste, détail). Ainsi, la FONDATION va vous demander de spécifier une commune base_name pour tous les types d'affichage pour une ressource.
Une autre solution pourrait être d'utiliser un ModelViewSet qui trouvera le nom de base automatiquement à partir du modèle.
Assurez-vous simplement et dites-lui le modèle à utiliser:
simplement le mentionner,
comme ça,
dans votre correspondant Viewset dans views.py au lieu de mentionner dans
def récupérer()...
sa a fonctionné pour moi 🙂
cette est une réponse utile, à lire pour les détails.
tl;dr
Il est utilisé comme nom de base de l'URL générée modèles (par exemple, 'monobjet-détail" ou "monobjet-list').