django 对象在序列化程序中没有get属性

7eumitmz  于 12个月前  发布在  Go
关注(0)|答案(2)|浏览(149)

我创建了一个序列化器和一个API端点,这样我就可以在我的React应用程序中从Django DB中检索一些数据,但是得到了这个错误消息:

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'),

js5cn81o

js5cn81o1#

感谢评论;我显然不明白序列化程序只转换我的数据以使其通过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'),

bsxbgnwa

bsxbgnwa2#

您正在尝试将序列化程序用作视图。
代码应为:
models.py

class ProgrammingChallenge(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField()
    expectations = models.TextField()

字符串
一些建议:
1.您的模型名称可以是ProgrammingChallenge(单数),而不是ProgrammingChallenge(复数)。
1.我认为没有必要在所有字段名之前添加前缀challenge。因为很明显,字段都在一个名为ProgrammingChallenge的Model中。而且像ProgrammingChallenge.name这样比ProgrammingChallenge.challenge_name更易读,更容易访问
1.不需要手动添加字段id,Django模型会自动添加id字段作为primary_key
serializer.py

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


序列化器没有问题。
现在,主要的问题是你的代码中没有任何视图。你可以使用APIViewgeneric viewsviewset。在这个例子中,我将使用ModelViewSet来处理指定模型的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


使用viewset的另一个优点是,它还通过路由自动为其CRUD方法生成所有端点。
它可以帮助你开始你的第一个项目。

相关问题