DRF AttributeError类型对象' QuerySet'没有属性' nom'

时间:2015-03-18 13:15:37

标签: python django

我正在制作我的第一个DRF api我得到一个我不理解的奇怪的AttributeError。当我尝试使用GET请求访问我的数据时,出现此错误:

  

尝试获取字段nom的值时出现AttributeError   序列化器ExpediteurSerializer。序列化程序字段可能已命名   错误且不匹配type实例上的任何属性或键。   原始异常文本是:类型对象'QuerySet'没有属性   'NOM'。

我想我在serializers.py文件中做了一些意想不到的事情..下面是我的代码的一些片段。

models.py

from django.db import models

# Create your models here.

class Expediteur(models.Model):
    nom = models.CharField(max_length=50)
    prenom = models.CharField(max_length=100)
    adresse = models.CharField(max_length=200)
    tel = models.IntegerField()

views.py

from django.shortcuts import render
from rest_framework import viewsets
from rest_framework.views import APIView
from rest_framework.response import Response
from polls.serializers import ExpediteurSerializer, DestinataireSerializer, LettrePrioSerializer, TypeLettreRecoSerializer, LettreRecoSerializer, TimbrePrioSerializer, TimbreRecoSerializer
from polls.models import Expediteur, Destinataire, LettrePrio, TypeLettreReco, LettreReco, TimbrePrio, TimbreReco
from rest_framework import status, HTTP_HEADER_ENCODING
from django.shortcuts import render, get_object_or_404

import json
import datetime

from django.http import HttpResponseRedirect, HttpResponse, Http404
from django.shortcuts import render, get_object_or_404
from django.core.urlresolvers import reverse
from django.contrib.auth.decorators import user_passes_test
from django.contrib.auth import login
from django.core.exceptions import ObjectDoesNotExist
from django.views.decorators.csrf import csrf_exempt
from django.utils.timezone import get_current_timezone

# Create your views here.

class ExpeViewSet(APIView):
    serializer_class = ExpediteurSerializer

    def get(self, request):
        queryset = Expediteur.objects.all()
        serializer = ExpediteurSerializer(queryset)
        return Response(serializer.data)

    def post(self, request):
        serializer = self.serializer_class(data=request.DATA)
        return Response(status=status.HTTP_201_CREATED)

serializers.py

from rest_framework import serializers
from polls.models import Expediteur, Destinataire, LettrePrio, TypeLettreReco, LettreReco, TimbrePrio, TimbreReco


class ExpediteurSerializer(serializers.Serializer):
    nom = serializers.CharField(required=True, allow_blank=False, max_length=50)
    prenom = serializers.CharField(required=True, allow_blank=False, max_length=100)
    adresse = serializers.CharField(required=True, allow_blank=False, max_length=200)
    tel = serializers.IntegerField(required=True)

    def create(self, validated_data):
        return Expediteur.objects.create(**validated_data)
    def update(self, instance, validated_data):
        instance.nom = validated_data.get('nom', instance.nom)
        instance.prenom = validated_data.get('prenom', instance.prenom)
        instance.adresse = validated_data.get('adresse', insatnce.adresse)
        instance.tel = validated_data.get('tel', instance.tel)
        instance.save()
        return instance

1 个答案:

答案 0 :(得分:2)

我认为你错过了许多国旗,就像这样:

ExpediteurSerializer(queryset, many=True)

通常,您可以通过充分利用DRF来极大地简化代码。 首先,根据documentation使ExpediteurSerializer成为ModelSerializer。

然后你也可以摆脱创建和更新方法,DRF会为你完成所有这些。我强烈建议你看看ModelViewSets,它们让你的生活变得轻松。