Изменение шаблонов маршрута DRF по умолчанию - PullRequest
0 голосов
/ 08 мая 2020

Мой 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

Есть ли способ сделать это?

Ответы [ 2 ]

1 голос
/ 10 мая 2020

Это может быть достигнуто с помощью действий 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-адрес, я ожидаю, что вам придется написать собственное представление и сопоставить его с требуемым URL-адресом в urls.py.

Это будет означать, что:

  • вызовы http://localhost:8000/unmapped/ выполнят 'list' logi c
  • вызовы http://localhost:8000/<pk>/unmapped/ выполнят обновление logi c
0 голосов
/ 17 мая 2020

Ответ от @ 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'

...