首页 > 解决方案 > 更改默认 DRF 路由模式

问题描述

我的 models.py 看起来像

class Article(models.Model):
    article_type = models.ForeignKey(
        ArticleType,
        null=True,
        on_delete=models.CASCADE,
        related_name='articles'
    )

    title = models.CharField(
        max_length=100,
        verbose_name='Article Title'
    )

和 urls.py

router = DefaultRouter()
router.register('article', ArticleViewSet, basename='article')
urlpatterns = [
    path('viewset/', include(router.urls)),
]

现在我不想列出所有带有 'article_type=None' 的文章并通过点击更新它们

http://127.0.0.1:8000/viewset/article/unmapped

有没有办法做到这一点?

标签: pythonurldjango-rest-framework

解决方案


这可以使用ViewSet 操作来实现。实施将遵循以下原则:

    @action(detail=True, methods=["GET", "PUT"])
    def unmapped(self, request, pk=None):
        if not pk:
            # perform list operation
            articles = self.queryset.filter(article_type=None)
            serializer = self.get_serializer(articles, many=True)
            return Response(serializer.data)
        obj = get_object_or_404(self.queryset, pk=pk)
        # map obj to article type
        return Response(status=status.HTTP_200_OK)

这使用 ViewSet 操作功能。如果您需要自定义 URL,我希望您必须编写一个自定义视图并将其映射到urls.py.

这将意味着:

  • 调用http://localhost:8000/unmapped/将执行“列表”逻辑
  • 调用http://localhost:8000/<pk>/unmapped/将执行更新逻辑

推荐阅读