#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
при регистрации набора представлений.