аргумент `basename` не указан

#rest #django-rest-framework #frameworks

#rest #django-rest-framework #фреймворки

Вопрос:

я создал новый проект с помощью django restframework имя проекта = фрейм-й project_app имя = фреймворк

fram.urls.py:

 """frame URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path,re_path
from django.conf.urls import include,url
from framework.views import myviewset
from rest_framework import routers

router = routers.DefaultRouter();
router.register('task', myviewset)

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'', include(router.urls)),
]
  

фреймворк models.py:

 from django.db import models

# Create your models here.
class Task (models.Model):
    task_name=models.CharField(max_length='200')
    task_desc=models.CharField(max_length='200')
    date_created=models.DateTimeField(auto_now=True)
  

serializer.py

 from .models import Task
from rest_framework import serializers


class TaskSerializers(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = ('id', 'task_name', 'task_desc')
  

views.py:

 from django.shortcuts import render
from .serializer import TaskSerializers
from rest_framework import viewsets
from .models import Task


# Create your views here.
class myviewset(viewsets.ModelViewSet):
    query = Task.objects.all().order_by('date_created')

    serializer_class = TaskSerializers
  

admin.py:

 from django.contrib import admin
from .models import Task


admin.site.register(Task)
# Register your models here.
  

setting.py:

 INSTALLED_APPS = [
    'framework',
    'rest_framework',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
  

когда я запускаю сервер в CMD
, появляется эта ошибка :

Ошибка утверждения: basename аргумент не указан и не может автоматически определять имя из набора представлений, поскольку у него нет .queryset атрибута.

Ответ №1:

Вы должны указать queryset атрибут вместо query в вашем viewset. Например (регистр имени класса изменен на соответствие PEP8):

 class MyViewSet(viewsets.ModelViewSet):
    queryset = Task.objects.all().order_by('date_created')

    serializer_class = TaskSerializers
  

Документы: https://www.django-rest-framework.org/api-guide/viewsets/#modelviewset

Также я рекомендую всегда указывать basename , когда вы регистрируете свои наборы представлений. Вот так:

 router = routers.DefaultRouter();
router.register('task', MyViewSet, basename='tasks')
  

https://www.django-rest-framework.org/api-guide/routers/#usage

basename — База, используемая для создаваемых имен URL. Если значение не задано, базовое имя будет автоматически сгенерировано на основе queryset атрибута viewset, если он у него есть. Обратите внимание, что если набор представлений не включает queryset атрибут, который необходимо установить basename при регистрации набора представлений.