Django错误 __init__()只需要1个位置参数,但是给出了2个

5

我目前正在使用 Django 2.1 制作一个简单的 GET/POST API。在运行服务器并访问 .../article/ URL 后,它返回了一个错误:

init() 函数需要一个参数,但是现在给了两个参数。

追踪信息:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/article/

Django Version: 2.1
Python Version: 3.6.5
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'rest_framework',
 'api.apps.ApiConfig']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "C:\Users\admin\Miniconda3\lib\site-packages\django-2.1-py3.6.egg\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\admin\Miniconda3\lib\site-packages\django-2.1-py3.6.egg\django\core\handlers\base.py" in _get_response
  126.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\admin\Miniconda3\lib\site-packages\django-2.1-py3.6.egg\django\core\handlers\base.py" in _get_response
  124.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\admin\Miniconda3\lib\site-packages\django-2.1-py3.6.egg\django\views\decorators\csrf.py" in wrapped_view
  54.         return view_func(*args, **kwargs)

File "C:\Users\admin\Miniconda3\lib\site-packages\django-2.1-py3.6.egg\django\views\generic\base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)

File "C:\Users\admin\Miniconda3\lib\site-packages\rest_framework\views.py" in dispatch
  483.             response = self.handle_exception(exc)

File "C:\Users\admin\Miniconda3\lib\site-packages\rest_framework\views.py" in handle_exception
  443.             self.raise_uncaught_exception(exc)

File "C:\Users\admin\Miniconda3\lib\site-packages\rest_framework\views.py" in dispatch
  480.             response = handler(request, *args, **kwargs)

File "C:\Users\admin\Desktop\crawler\api\views.py" in get
  13.         article_serializer = ArticleSerializer(article, many=True)

Exception Type: TypeError at /article/
Exception Value: __init__() takes 1 positional argument but 2 were given

我的models.py文件

from django.db import models
# Create your models here.
class Article(models.Model):
    class Meta:
        verbose_name_plural = "Article"
        verbose_name = "Article"

    id = models.ForeignKey('ArticlePicture', on_delete=models.CASCADE,primary_key=True)
    type = models.CharField(max_length=256, null=True)
    name = models.CharField(max_length=256, null=True)
    title = models.CharField(max_length=256, null=True)
    address = models.TextField(null=True)
    city = models.CharField(max_length=256, null=True)
    price = models.CharField(max_length=256,null=True)
    area = models.CharField(max_length=256,null=True)
    description = models.TextField(null=True)
    sell_date = models.TextField(null=True)
    expired_date = models.TextField(null=True)
    website = models.ForeignKey('Website', on_delete=models.CASCADE,default=1)
    website_uuid = models.CharField(max_length=256, null=True)
    seller_name = models.CharField(max_length=256, null=True)
    seller_address = models.CharField(max_length=256, null=True)
    seller_phone = models.CharField(max_length=256, null=True)
    seller_mobile = models.CharField(max_length=256, null=True)
    seller_email = models.CharField(max_length=256, null=True)
    seller_picture = models.TextField(null=True)
    project_name = models.CharField(max_length=256,null=True)
    project_investor = models.CharField(max_length=256,null=True)
    extended_data = models.TextField(null=True)

    def __str__(self):
         return self.id
class Website(models.Model):
    class Meta:
        verbose_name_plural = "Website"
        verbose_name = "Website"

    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=256,null=True)
    url = models.TextField(null=True)

    def __str__(self):
        return self.id
class ArticlePicture(models.Model):
    class Meta:
        verbose_name_plural = "ArticlePicture"
        verbose_name = "ArticlePicture"

    id = models.AutoField(primary_key=True)
    article_id = models.ForeignKey(Article, on_delete=models.CASCADE)
    url = models.TextField(null=True)

    def __str__(self):
        return self.id

VIEWS.PY:

from rest_framework import serializers
from rest_framework import serializers, viewsets, status
from rest_framework.response import Response
from django.contrib import admin, auth
from .serializers import ArticleSerializers, ArticlePictureSerializers
from .models import Article, ArticlePicture
from rest_framework.views import APIView
from django.http import Http404
from django.shortcuts import render
class ArticleSerializer(APIView):
    def get(self, request):
        article = Article.objects.all()
        article_serializer = ArticleSerializer(article, many=True)
        return Response(article_serializer.data)
    def post(self, request):
        article_serializers = ArticleSerializer(data = request.data)
        if article_serializers.is_valid():
            article_serializers.save()
            return Response(article_serializers.data, status=status.HTTP_201_CREATED)
        return Response(article_serializers.errors, status=status.HTTP_400_BAD_REQUEST)
class ArticlePictureSerializer(APIView):
    def get(self, request):
        article_picture = ArticlePicture.objects.all()
        article_picture_serializer = ArticlePictureSerializers(article, many=True)
        return Response(article_picture_serializer.data)
    def post(self, request):
        article_picture_serializers = ArticlePictureSerializers(data = request.data)
        if article_picture_serializers.is_valid():
            article_picture_serializers.save()
            return Response(article_picture_serializers.data, status=status.HTTP_201_CREATED)
        return Response(article_picture_serializers.errors, status=status.HTTP_400_BAD_REQUEST)  

SERIALIZERS.PY :

from rest_framework import serializers
from .models import Article, ArticlePicture
class ArticleSerializers(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = '__all__'
class ArticlePictureSerializers(serializers.ModelSerializer):
    class Meta:
        model = ArticlePicture
        fields = '__all__'

我的URLS.PY文件:

from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
from api import views
from rest_framework.urlpatterns import format_suffix_patterns
from rest_framework import routers
urlpatterns = [
    path('admin/', admin.site.urls),
    path('article/',views.ArticleSerializer.as_view()),
    path('articlepic/',views.ArticlePictureSerializer.as_view()),
]
urlpatterns = format_suffix_patterns(urlpatterns)

我在路径后添加了.as_view(),但仍然返回原始内容。我还在努力找出我的错误在哪里。


1
这里有很多东西,回溯在哪里? - Stephen Rauch
2个回答

5
你的视图和序列化器有相同的名称,尝试重新命名视图类,例如:
VIEWS.PY:
...
class ArticleAPI(APIView):
    def get(self, request):
        article = Article.objects.all()
        article_serializer = ArticleSerializer(article, many=True)

...

4
问题出现在views.py中,注意你没有调用正确的序列化类。
将ArticleSerializer更改为 ArticleSerializers
...
class ArticleSerializer(APIView):
def get(self, request):
    article = Article.objects.all()
    article_serializer = ArticleSerializers(article, many=True)
    return Response(article_serializer.data)
def post(self, request):
    article_serializers = ArticleSerializers(data = request.data)
    if article_serializers.is_valid():
        article_serializers.save()
        return Response(article_serializers.data, status=status.HTTP_201_CREATED)
    return Response(article_serializers.errors, status=status.HTTP_400_BAD_REQUEST)
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接