【问题标题】:DRF url route did not match for genericview RetrieveUpdateAPIViewDRF url 路由与 genericview RetrieveUpdateAPIView 不匹配
【发布时间】:2020-10-31 20:34:48
【问题描述】:

我已将以下路由添加到我的 Django Rest 框架项目中,该 url 匹配良好并返回订单和库存的列表视图,但它与详细视图 order/<int:order_no>inventory/<int:pk> 不匹配

localhost:8000/FD/orders/ 工作但 localhost:8000/FD/order/1/不匹配返回

Using the URLconf defined in FriendsDigital.urls, Django tried these  
URL patterns, in this order:  
 
1. admin/  
2. ^rest-auth/  
3. ^FD/ ^inventories/$ [name='inventory_list']   
4. ^FD/  ^inventory/<int:pk>/ [name='inventory_edit']  
5. ^FD/ ^orders/ [name='orders_list']  
6. ^FD/ ^order/<int:order_no>/ [name='order_update']  

The current path, FD/order/1/, didn't match any of these

库存也是同样的问题

网址.py

urlpatterns = [
    url('^inventories/$', InventoryList.as_view(), name='inventory_list'),
    url('^inventory/<int:pk>/', InventoryRetrieveUpdate.as_view(), name='inventory_edit'),
    url('^orders/', BusinessOrderList.as_view(), name='orders_list'),
    url('^order/<int:order_no>/',BusinessOrderUpdate.as_view(), name='order_update')
]

views.py

class InventoryList(generics.ListAPIView):
    queryset= Inventory.objects.all()
    serializer_class = InventorySerializer

class InventoryRetrieveUpdate(generics.RetrieveUpdateAPIView):
    queryset = Inventory.objects.all()
    serializer_class = InventorySerializer

class BusinessOrderList(generics.ListCreateAPIView):
    queryset = BusinessOrder.objects.all()
    serializer_class = BusinessOrderSerializer

class BusinessOrderUpdate(generics.RetrieveUpdateAPIView):
    queryset = BusinessOrder.objects.all()
    serializer_class = BusinessOrderSerializer

Django 版本 - 3.0.7 DjangoRestFramework - 3.11.0

【问题讨论】:

    标签: python django django-rest-framework django-urls django-generic-views


    【解决方案1】:

    DRF 查找字段默认为“pk”,因此您必须手动指定查找字段:

    class BusinessOrderUpdate(generics.RetrieveUpdateAPIView):
        queryset = BusinessOrder.objects.all()
        serializer_class = BusinessOrderSerializer
        lookup_field = 'order_no'
    

    【讨论】:

      【解决方案2】:

      如果您想为您的网址使用尖括号表示法 (&lt;int:order_no&gt;),您需要使用 pathurl 函数是 re_path 的别名,它使用正则表达式

      from django.urls import path
      
      urlpatterns = [
          ...
          path('order/<int:order_no>/', BusinessOrderUpdate.as_view(), name='order_update')
      ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-21
        • 2014-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-29
        • 1970-01-01
        相关资源
        最近更新 更多