Объект не имеет атрибута get в сериализаторе

Я создал сериализатор и конечную точку API, чтобы я мог получить некоторые данные из БД Django в моем приложении React, но получаю следующее сообщение об ошибке:

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

Вот мой 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()

мой сериализатор:

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

и мой urls.py:

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

Спасибо за комментарии; я явно не понял, что сериализатор только преобразует мои данные, чтобы сделать их доступными через API. Мне все еще нужно было создать представление для конечной точки моего API.

Я решил создать ReadOnlyModelView, потому что я хочу только GET данные из этой конечной точки.

Вот что я написал в своих мнениях:

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

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

и в моем urls.py:

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

Думаю, вам не стоит торопиться и еще раз прочитать документацию. Вы пытаетесь использовать сериализаторы в качестве представлений.

Модели - это представление таблиц БД в виде класса. Сериализатор сериализует данные в json. Представление принимает запрос от клиента и возвращает ответ.

Код должен быть:

models.py

class ProgrammingChallenge(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField()
    expectations = models.TextField()
  1. Ваше имя модели должно быть ProgrammingChallenge(единственное число), а не ProgrammingChallenges(множественное число).

  2. Вы не должны добавлять префикс challenge перед всеми именами полей. Потому что мы уже знаем, что эти поля находятся в модели под названием ProgrammingChallenge. И проще обращаться к ним как ProgrammingChallenge.name, чем ProgrammingChallenge.challenge_name

    .
  3. Вам не нужно добавлять поле id вручную. Модель Django автоматически добавляет поле id в качестве primary_key

    .

serializer.py

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

Нет проблем в serialize.

Сейчас основная проблема в том, что у вас нет никакого представления. Вы определенно читали документацию. Вы можете использовать APIView, общие представления или набор представлений. В этом примере я собираюсь использовать ViewSet, который обрабатывает встроенные CRUD операции.

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

Еще одно преимущество использования набора представлений, он также генерирует все конечные точки для своих CRUD методов автоматически через маршруты.

Это должно помочь вам начать свой первый проект. ОПЯТЬ ЖЕ, ЧИТАЙТЕ ДОКУМЕНТАЦИЮ!

Вернуться на верх