django-rest-framework:int()参数必须是字符串,类似字节的对象或数字,而不是Deferred Attribute

时间:2018-12-10 13:44:59

标签: python django django-rest-framework

我正在使用django-rest-framework创建示例rest API, 我在那里的网站https://www.django-rest-framework.org/tutorial/1-serialization/中查阅了该教程 列表和创建新对象时,我的api工作正常,但在对象的详细视图(http://127.0.0.1:8000/cars/1)期间抛出异常。

我在下面添加了我的代码段,请让我知道我在做什么错了

Models.py

class Car(models.Model):

    created = models.DateTimeField(auto_now_add=True)
    name = models.CharField(max_length=100, blank=True, default='')
    price = models.TextField()

    class Meta:
        ordering = ('created',)

serializers.py

class CarsSerializer(serializers.ModelSerializer):

    class Meta:
        model = Car
        id = serializers.IntegerField(read_only=True)
        fields = ('id', 'created', 'name', 'price')

Views.py

@csrf_exempt
def car_list(request):
"""
List all code cars, or create a new car.
"""
    if request.method == 'GET':
        cars = Car.objects.all()
        serializer = CarsSerializer(cars, many=True)
        return JsonResponse(serializer.data, safe=False)

    elif request.method == 'POST':
        data = JSONParser().parse(request)
        serializer = CarsSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=201)
        return JsonResponse(serializer.errors, status=400)


@csrf_exempt
def car_detail(request, pk):
"""
Retrieve, update or delete a code cars.
"""
    try:
        car = Car.objects.get(pk=pk)
    except Car.DoesNotExist:
        return HttpResponse(status=404)

    if request.method == 'GET':
        serializer = CarsSerializer(Car)
        return JsonResponse(serializer.data)

    elif request.method == 'PUT':
        data = JSONParser().parse(request)
        serializer = CarsSerializer(Car, data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)

    elif request.method == 'DELETE':
        Car.delete()
        return HttpResponse(status=204)

Urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    path('cars/', views.car_list),
    path('cars/<int:pk>/', views.car_detail),

]

1 个答案:

答案 0 :(得分:0)

首先,您需要发布异常。

但是问题是您将class而不是class的实例传递给序列化程序。

try:
    car = Car.objects.get(pk=pk)
except Car.DoesNotExist:
    return HttpResponse(status=404)

if request.method == 'GET':
    serializer = CarsSerializer(car)  #  <-- car not Car (this type of error should be fixed everywhere)
    return JsonResponse(serializer.data)

Car.delete()中应为car.delete()