Ответ 1
Попробуйте сделать это в своем urls.py. Третий параметр "Человек" может быть любым, что вы хотите.
router.register(r'person/food', views.PersonViewSet, 'Person')
Я создаю приложение Django, которое предоставляет REST API, с помощью которого пользователи могут запрашивать мои модели приложений. Я следую инструкциям здесь.
Мой маршрут выглядит так в myApp 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)),
Моя модель выглядит так:
class MyObject(models.Model):
name = models.TextField()
Мой сериализатор выглядит так:
class MyObjectSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = MyObject
fields = ('id', 'name',)
My Viewset выглядит так:
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)
Когда я ударяю /api/myObjects/ 60/, я получаю следующую ошибку:
base_name
аргумент не указан и не может автоматически определять имя из вида, так как он не имеет атрибута.model
или.queryset
.
Я понимаю из здесь, что мне нужен параметр base_name на моем маршруте. Но из документов мне непонятно, какова должна быть эта величина параметра base_name. Может кто-нибудь, пожалуйста, скажите мне, какой маршрут должен выглядеть с помощью base_name?
Попробуйте сделать это в своем urls.py. Третий параметр "Человек" может быть любым, что вы хотите.
router.register(r'person/food', views.PersonViewSet, 'Person')
Возможно, вам просто нужно установить параметр base_name
для вашего маршрутизатора с именем объекта: MyObject
в вашем случае.
router.register(r'myObjects/(?P<id>\d+)/?$', views.MyObjectsViewSet, base_name="MyObject")
http://www.django-rest-framework.org/api-guide/routers/#Usage
Позвольте мне объяснить, зачем нам сначала нужно имя base_name, а затем перейти к возможному значению base_name.
Если вы когда-либо использовали URL-адреса Django без rest-framework (DRF) ранее, вы бы указали его так:
urlpatterns = [
url(r'myObjects/(?P<id>\d+)/?$', views.MyObjectsListView.as_view(), name='myobject-list'),
url(r'myObjects/(?P<id>\d+)/?$', views.MyObjectsDetailView.as_view(), name='myobject-detail'),
]
Здесь, если вы видите, есть параметр имени, который используется для идентификации URL в текущем пространстве имен (которое является приложением).
Это именно то, что django-rest-framework пытается сделать автоматически, так как drf знает, является ли представление списком или подробностями (из-за viewset). ему просто нужно добавить какой-то префикс для разграничения URL. Это цель base_name (префикс).
В большинстве сценариев вы можете дать URL-адрес или имя ресурса в качестве base_name. В вашем случае base_name = myobject. DRF сгенерирует base_name + view_type в качестве параметра имени, такого как myobject_list & myobject_detail.
Примечание: Как правило, base_name будет автоматически получается из поля QuerySet (с точкой зрения), так как она одинакова для всех типов просмотра в режиме просмотра. Но если вы укажете метод get_queryset вместо queryset, это может означать, что у вас другой набор запросов для разных типов представлений (например, list, detail). Итак, DRF попросит вас указать общее base_name для всех типов представлений для ресурса.
Альтернативным решением может быть использование ModelViewSet, который автоматически выводит базовое имя из модели.
Просто убедитесь и скажите, какую модель использовать:
Поскольку ModelViewSet расширяет GenericAPIView, вам обычно нужно укажите, по крайней мере, атрибуты запроса и serializer_class, или ярлык атрибута модели.
просто укажите это,
queryset = MyObjects.objects.all()
как это,
class MyObjectsViewSet(viewsets.ViewSet):
queryset = MyObjects.objects.all()
в соответствующем разделе Viewset в views.py вместо упоминания в
def retrieve()...
его работало для меня:)
этот является полезным ответом, читайте для деталей.
TL;DR
Он используется как базовое имя сгенерированных шаблонов URL (например, "myobject-detail" или "myobject-list" ).