简体   繁体   中英

DRF AttributeError type object 'QuerySet' has no attribute 'nom'

I'm making my first DRF api I get a strange AttributeError that I don't understand. When I try to access to my data using a GET request, I get this error:

Got AttributeError when attempting to get a value for field nom on serializer ExpediteurSerializer . The serializer field might be named incorrectly and not match any attribute or key on the type instance. Original exception text was: type object 'QuerySet' has no attribute 'nom'.

I guess I've done something unexpected in my serializers.py file.. Here follows some snippets of my code.

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

I think you are missing the many flag in you view, like so:

ExpediteurSerializer(queryset, many=True)

In general you could simplify your code very much by fully utilizing DRF. First, make ExpediteurSerializer a ModelSerializer according to the documentation .

Then you can also get rid of the create and update method, DRF takes care of all of that for you. And I strongly recommend you to look at ModelViewSets, they make your life very easy.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM