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 个
我在这里做错了什么?请帮忙!
我认为本质上问题在于你使用了错误的观点。AListAPIView用于检索对象列表。
您可以在这里使用已经实现了样板逻辑的RetrieveAPIView[drf-doc] 。如果您的 URL 包含pk参数,它可以自动过滤该参数pk,因此无需自己实现此逻辑:
from rest_framework.generics import RetrieveAPIView
class dispatchhistoryitemsview(RetrieveAPIView):
queryset = ItemBatch.objects.all()
serializer_class = holdSerializerRun Code Online (Sandbox Code Playgroud)
此外,正如@ruddra 所说,您应该使用命名参数,因为第三个参数是 kwargs:
path(
'api/dispatchhistoryitem/<int:pk>/',
views.dispatchhistoryitemsview.as_view(),
name='dispatchhistoryitem'
),Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10569 次 |
| 最近记录: |