Home > Software design >  Object has no attribute get in serializer
Object has no attribute get in serializer

Time:05-02

I created a serializer and an API endpoint so I can retrieve some data from a Django DB in my React app but getting this error message:

AttributeError: 'ProgrammingChallengesView' object has no attribute 'get'

Here is my models.py:

#creating programming challenges
class ProgrammingChallenges(models.Model):
    challenge_id = models.AutoField(primary_key=True)
    challenge_name = models.CharField(max_length=200)
    challenge_description = models.TextField()
    challenge_expectations = models.TextField()

my serializer:

from accounts.models import ProgrammingChallenges
...
class ProgrammingChallengesView(serializers.ModelSerializer):
    class Meta:
        model = ProgrammingChallenges
        fields = '__all__'

and my urls.py:

path('api/programming_challenges/', ProgrammingChallengesView, name='programming_challenges'),

CodePudding user response:

Thanks to the comments; I clearly didn't understand that a serializer only transforms my data to make it available through an API. I still had to create a view for my API's endpoint.

I opted to create a ReadOnlyModelView because I only want to GET data from this endpoint.

Here is what I wrote in my views:

class ProgrammingChallengesView(ReadOnlyModelViewSet):
    serializer_class = ProgrammingChallengesSerializer
    queryset = ProgrammingChallenges.objects.all()

    @action(detail=False)
    def get_list(self, request):
        pass

and in my urls.py:

path('api/programming_challenges/', ProgrammingChallengesView.as_view({'get':'list'}), name='programming_challenges'),

CodePudding user response:

I think you shouldn't hurry read the docs again. You are trying to use serializers as views.

Models - are representation of db tables as class. Serializer serializes the data to json. View accepts the reqeust from client and returns a Response.

Code shoudld be:

models.py

class ProgrammingChallenge(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField()
    expectations = models.TextField()
  1. Your model name should be ProgrammingChallenge(singular) not ProgrammingChallenges(plural).

  2. You should't add prefix challenge before all field names. Because we already know that the fields are in a Model called ProgrammingChallenge. And it is easy to access them like ProgrammingChallenge.name than ProgrammingChallenge.challenge_name

  3. You don't have to add field id manually. Django model automatically adds id field as primary_key

serializer.py

from accounts.models import ProgrammingChallenge
...
class ProgrammingChallengeSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProgrammingChallenge
        fields = '__all__'

No problem in serialize.

Now, main problem is you don't have any view. You definetly read docs. You can use APIView, generic views or viewset. In this example i'm going to use ViewSet that handles CRUD operations built in.

viewsets.py

from rest_framework.viewsets import ModelViewSet

from .models import ProgrammingChallenge
from .serializers import ProgrammingChallengSerializer


class ProgrammingChallengViewSet(ModelViewSet):
    queryset = ProgrammingChallenge.objects.all()
    serializer_class = ProgrammingChallengeSerializer

urls.py

from rest_framework.routers import SimpleRouter

from .viewsets import ProgrammingChallenge

router = SimpleRouter()
router.register('challengr', ProgrammingChallengeViewSet)

urlpatterns = router.urls

Another advantage of using viewset, it also generate all endpoint for it's CRUD methods automatically via routes.

It should help you to start your first project. AGAIN, READ THE DOCS!

  • Related