在DJango Rest中无法获得GET响应

时间:2018-04-13 20:46:34

标签: python django django-rest-framework

我正在尝试学习DJango Rest,所以我做了一个小小的测试,看看我是否可以从数据库中获取一些东西,但是我遇到了一些问题。

这是我的models.py:

from django.db import models


# Create your models here.

class Stock(models.Model):
    ticker = models.CharField(max_length=10)
    open = models.FloatField()
    close = models.FloatField()
    volume = models.IntegerField()

    def __str__(self):
        return self.ticker

这是我的serializers.py:

from rest_framework import serializers
from .models import Stock


class StockSerializer(serializers.ModelSerializer):
    ticker = serializers.CharField()
    open = serializers.FloatField()
    close = serializers.FloatField()
    volume = serializers.IntegerField()

    def create(self, validated_data):
        return Stock.objects.check(**validated_data)

    def update(self, instance, validated_data):
        instance.ticker = validated_data.get('ticker', instance.ticket)
        instance.open = validated_data.get('open', instance.open)
        instance.close = validated_data.get('close', instance.close)
        instance.volume = validated_data.get('volume', instance.volume)
        instance.save()
        return instance

    class Meta:
        model = Stock
        fields = '__all__'

这是我的views.py:

from django.http import Http404
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework.views import APIView

from .models import Stock
from .serializers import StockSerializer


# List all stocks or create a new one
# stocks/


@api_view(['GET', 'POST'])
def stock_list(request, format=None):
    if request.method == 'GET':
        stocks = Stock.objects.all()
        serializer = StockSerializer(stocks, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = StockSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


@api_view(['GET', 'POST', 'DELETE'])
def stock_detail(request, pk, format=None):
    try:
        stock = Stock.objects.get(pk=pk)
    except Stock.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        serializer = StockSerializer(stock)
        return Response(serializer.data)

    elif request.method == 'PUT':
        serializer = StockSerializer(stock, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
        stock.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

最后,这是我的url.py:

from django.conf.urls import url
from django.contrib import admin
from rest_framework.urlpatterns import format_suffix_patterns
from companies import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^stocks/', views.stock_list),
    url(r'^stocks/(?P<pk>[0-9]+)$', views.stock_detail),
]

urlpatterns = format_suffix_patterns(urlpatterns)

我一直在关注this tutorial,但是当谈到发出一些请求的时候(对于这个例子,我使用了这个:http http://127.0.0.1:8000/stocks/

我收到此错误消息:

  

/ stocks / stock_list()中的TypeError缺少1个必需的位置   参数:'request'

我认为问题在于网址,但我不确定如何修复它。 有什么想法和一些例子吗?

更新:问题在于视图中的方法(他们有一个非常好的自我)

一般的Get方法有效,但是当我尝试使用POST时 POST错误: 当我尝试这个请求时:http - 形成POST http://127.0.0.1:8000/stocks/ ticker ='SAM'

我收到此错误:

  尝试获取时,

在/ stocks / Got AttributeError处的AttributeError   序列化程序ticker上的字段StockSerializer的值。该   序列化程序字段可能命名不正确且不匹配任何字段   list实例上的属性或键。原始例外文本是:   'list'对象没有属性'ticker'。

2 个答案:

答案 0 :(得分:1)

您需要删除self

请记住,您使用的是函数而非clases。

@api_view(['GET', 'POST'])
def stock_list(request, format=None):
    if request.method == 'GET':
        stocks = Stock.objects.all()
        serializer = StockSerializer(stocks, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = StockSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

答案 1 :(得分:-1)

在urls.py中尝试views.stock_list.as_view()