Подтвердить что ты не робот

Какой параметр base_name необходимо в моем маршруте, чтобы этот Django API работал?

Я создаю приложение 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?

4b9b3361

Ответ 1

Попробуйте сделать это в своем urls.py. Третий параметр "Человек" может быть любым, что вы хотите.

router.register(r'person/food', views.PersonViewSet, 'Person')

Ответ 2

Возможно, вам просто нужно установить параметр 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

Ответ 3

Позвольте мне объяснить, зачем нам сначала нужно имя 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 для всех типов представлений для ресурса.

Ответ 4

Альтернативным решением может быть использование ModelViewSet, который автоматически выводит базовое имя из модели.

Просто убедитесь и скажите, какую модель использовать:

Поскольку ModelViewSet расширяет GenericAPIView, вам обычно нужно укажите, по крайней мере, атрибуты запроса и serializer_class, или ярлык атрибута модели.

Ответ 5

просто укажите это,

queryset = MyObjects.objects.all()

как это,

class MyObjectsViewSet(viewsets.ViewSet):
    queryset = MyObjects.objects.all()

в соответствующем разделе Viewset в views.py вместо упоминания в

def retrieve()...

его работало для меня:)

Ответ 6

этот является полезным ответом, читайте для деталей.

TL;DR

Он используется как базовое имя сгенерированных шаблонов URL (например, "myobject-detail" или "myobject-list" ).