在 Django Rest Framework 中通过 URL 中的 pk 获取对象

Rah*_*rma 3 django django-rest-framework

我想通过 URL 中的“pk”从 ORM 检索对象。这就是我正在尝试的

这是我的网址:

path('api/dispatchhistoryitem/<int:pk>/', views.dispatchhistoryitemsview.as_view(), 'dispatchhistoryitem'),
Run Code Online (Sandbox Code Playgroud)

视图.py

class dispatchhistoryitemsview(ListAPIView):
    queryset = ItemBatch.objects.all()
    serializer_class = holdSerializer

    def get(self, request, pk, *args, **kwargs):
        items = get_object_or_404(ItemBatch, id=self.kwargs.get('pk'))
        serializer = holdSerializer(items)
        return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

序列化器.py

class holdSerializer(serializers.ModelSerializer):
    class Meta:
        model = ItemBatch
        fields = "__all__"
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时它说:

/api/dispatchhistoryitem/43/处的值错误

字典更新序列元素#0的长度为1;需要 2 个

我在这里做错了什么?请帮忙!

Wil*_*sem 6

我认为本质上问题在于你使用了错误的观点。AListAPIView用于检索对象列表。

您可以在这里使用已经实现了样板逻辑的RetrieveAPIView[drf-doc] 。如果您的 URL 包含pk参数,它可以自动过滤该参数pk,因此无需自己实现此逻辑:

from rest_framework.generics import RetrieveAPIView

class dispatchhistoryitemsview(RetrieveAPIView):
    queryset = ItemBatch.objects.all()
    serializer_class = holdSerializer
Run Code Online (Sandbox Code Playgroud)

此外,正如@ruddra 所说,您应该使用命名参数,因为第三个参数是 kwargs:

path(
    'api/dispatchhistoryitem/<int:pk>/',
    views.dispatchhistoryitemsview.as_view(),
    name='dispatchhistoryitem'
),
Run Code Online (Sandbox Code Playgroud)