2

Я хочу построить простой API и взял Django REST Framework (DRF). Я хочу, чтобы minimize path nesting, как Tom Christie (автор DRF) указал на меня.Как построить вложенный маршрут с помощью Django REST Framework?

Есть две модели: Статья и Комментарий.
Для них я хочу построить следующие пути API (с создания [C], считывания [R] и обновление [U] доступа):

/      [R] 
/articles/    [R] 
/articles/:id/   [R] 
/articles/:id/comments [R] 
/comments/    [CRU] 
/comments/:id   [R] 

models.py:

class Article(models.Model): 
    text = models.CharField(max_length=140, blank=False) 
    recorded_at = models.DateTimeField(blank=False) 
    modified_at = models.DateTimeField(auto_now_add=True) 


class Comment(models.Model): 
    message = models.CharField(max_length=140, blank=False) 
    created_at = models.DateTimeField(auto_now_add=True) 
    modified_at = models.DateTimeField(auto_now_add=True) 
    article = models.ForeignKey('Article', default=1, related_name='article') 

serializers.py:

class ArticleSerializer(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = Article 


class CommentSerializer(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = Comment 

views.py:

class ArticleViewSet(mixins.RetrieveModelMixin, 
        mixins.ListModelMixin, 
        viewsets.GenericViewSet): 
    queryset = Article.objects.all() 
    serializer_class = ArticleSerializer 


class CommentViewSet(mixins.CreateModelMixin, 
        mixins.RetrieveModelMixin, 
        mixins.ListModelMixin, 
        viewsets.GenericViewSet): 
    queryset = Comment.objects.all() 
    serializer_class = CommentSerializer 

urls.py:

router = DefaultRouter() 
router.register(r'articles', ArticleViewSet) 
router.register(r'comments', CommentViewSet) 


urlpatterns = patterns('', 
    url(r'^', include(router.urls)), 
) 

Путь на рабочем уровне корня:

/      [R] 
/articles/    [R] 
/articles/:id/   [R] 
/comments/    [CRU] 
/comments/:id   [R] 

Однако вложенный путь возвращает 404.

/articles/:id/comments [R] 

ответ

1

Вам понадобится что-то подобное на вашем...

@detail_route(methods=['get']) 
def comments(self, request, pk=None): 
    article = self.get_object() 
    comments = article.comment_set.all() 
    serializer = CommentSerializer(comments) 
    return Response(serializer.data) 
+0

Путь, 'статьи /: идентификатор/comments' делает, когда я удаляю' related_name = 'article'' и использовать 'сериализатора = CommentSerializer (комментарии, контекст = {' запрос ': запрос}, много = True) '. Теперь только паническое слово указывает неправильное имя: 'Article' вместо' Comment'. – JJD

+0

«Теперь только сухарь говорит о неправильном имени: Article вместо комментария». Это будет оставаться таким же, если вы не захотите переопределить шаблон (я бы особо не рекомендовал этого). Я бы, вероятно, просто жил с ним в этот момент. –

+0

Теперь, когда вы говорите, что я помню, что где-то читал, что подробные представления не отображают правильный заголовок объекта. Спасибо. – JJD