更改默认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

有办法做到这一点吗?

这可以使用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中所需的URL。

这意味着:

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

@MathewHegarty的回答有帮助,但我通过解决了它

@action(detail=False, methods=["GET"], url_path='unmapped')
def unmapped(self, request):
articles = self.queryset.filter(article_type=None)
serializer = self.get_serializer(articles, many=True)
return Response(serializer.data)
@action(detail=True, methods=["GET"], url_path='unmapped')
def ret_map(self, request):
obj = get_object_or_404(self.queryset, pk=pk)
return Response(status=status.HTTP_200_OK)
@ret_map.mapping.put
def map(self, request):
#code for 'PUT'

最新更新