【问题标题】:DRF: How to use urls with UUIDDRF:如何使用带有 UUID 的 url
【发布时间】:2022-01-13 20:05:57
【问题描述】:

所以,我想停止使用 urlpatterns 并使用 router。但是我没有使用对象的 ID,而是使用 UUID,并且我将它与 urlpatterns 一起使用,并且找不到将它与 routers 一起使用的方法。 这是我目前的模型:

class Board(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=200, blank=False, null=False)

这是我的核心应用urls.py:

...

router = DefaultRouter()
router.register(r'boards', BoardViewSet)
router.register(r'y', yViewSet)
router.register(r'z', zViewSet, basename='z')


urlpatterns = [
    path('', include(router.urls)),
    path('board-list/<uuid:pk>/', BoardViewSet.as_view({'get': 'list'}), name='boards'),
]

这是urls.py的项目:

from django.contrib import admin
from django.urls import path, include
from core.urls import router as api_router

routes = []
routes.extend(api_router.urls)

urlpatterns = [
    path('api/', include((routes, 'board_microservice'), namespace='v1')),
    path('admin/', admin.site.urls),
]

应用程序使用正常,但我在测试时遇到了一些麻烦。 IE: 这很好用:

    url = reverse('v1:board-list')

    response = api_client().get(
        url
    )

它不起作用:

board = baker.make(Board)
url = reverse('v1:board-list', kwargs={"pk": board.id})
response = api_client().get(url)

我收到

django.urls.exceptions.NoReverseMatch: Reverse for 'board-list' with keyword arguments

我想我可以用router 替换urlpatterns 来解决它并让它变得更简单

有什么办法可以用路由器做到这一点?

【问题讨论】:

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


    【解决方案1】:

    您尚未分享您的观点,但您似乎正在使用ModelViewSet,并且您似乎正在寻找retrieve 端点而不是list(从使用pk 判断)。如果是这样,那么您想使用-detail 而不是-list

    url = reverse('v1:board-detail', kwargs={"pk": board.id})
    

    【讨论】:

      【解决方案2】:

      Board_list 不是您想要调用的...尝试使用 board_get。

      董事会名单不带任何参数。但是 get 确实可以。获得特定的棋盘。

      【讨论】:

        猜你喜欢
        • 2017-07-17
        • 2017-04-16
        • 2014-04-07
        • 1970-01-01
        • 1970-01-01
        • 2018-03-11
        • 2021-10-31
        • 2018-12-30
        • 2021-10-04
        相关资源
        最近更新 更多