Django: маршрутизатор ModelViewSet не работает для действия обновления - PullRequest
0 голосов
/ 20 марта 2020

Я использую ModelViewSet и Modelserializer для проекта, подобного блогу.

Могут возникнуть трудности с пониманием реализации; Я не могу заставить работать действие update через , вызывая его через маршрутизатор , только действие списка работает с указанным мною маршрутом.

Когда я добавляю URL: 127.0.0.1:8000/api/blogs/1, чтобы вернуть блог с идентификатором 1 для редактирования , он возвращает {"Detail": "Not Found."}.

Это мое мнение:

class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

Я также переопределил методы сохранения и обновления в классе сериализатора, не знаю, нужен ли он для ModelViewSet в ModelSerializer.

class ArticleSerializer(serializers.ModelSerializer):

    def create(self, validated_data):
        article = Article.objects.create(
            article_title = self.validated_data['article_title'],
            article_content = self.validated_data['article_content'],
            ...
        )
        return article

    def update(self, instance, validated_data):
        instance.article_title = validated_data.get('article_title', instance.article_title)
        instance.article_content = validated_data.get('article_content', instance.article_content)
        ...
        instance.save()
        return instance

    class Meta:
        model = Article
        fields = ...

И файл urls.py:

router = DefaultRouter()
router.register(r'blogs', ArticleViewSet, basename='articles-list')
urlpatterns = router.urls

Мой вопрос: 1. Как мне указать URL-адреса для действий ModelViewSet (в моем случае действие update)? 2. Будет ли достаточно определения только одного URL-адреса всеми моими потребностями при каждых действиях ModelViewSet? если да как?

Что я делаю не так? Я новичок в DRF.

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Нашел проблему. Я пытался URL-адрес localhost/api/blogs/1. Он возвращал это: "Detail": "Not Found". Это было потому, что не было ни одного экземпляра, сохраненного с идентификатором 1. Все мои сохраненные экземпляры имели разные идентификаторы, которые я раньше не замечал. После ввода доступных идентификаторов он вернул желаемый результат.

0 голосов
/ 22 марта 2020

Относительно ваших вопросов:

1) После регистрации ModelViewSet в маршрутизаторе API он создаст все необходимые URL-адреса для следующих действий. В вашем случае это будет следующим:

  • список (GET запрос к /api/blogs/)
  • получение (GET запрос к /api/blogs/{pk}/)
  • create (POST запрос на /api/blogs/)
  • обновление (запрос PUT на /api/blogs/{pk}/) (он будет проверять все поля модели)
  • частичное обновление (запрос PATCH на /api/blogs/{pk}/) (это не выполнять проверку - вы можете отправлять только поля, которые вы решили изменить)
  • удалить (УДАЛИТЬ запрос к /api/blogs/{pk}/)

Итак, в основном маршрутизатор выполняет большую часть работы для Вы о регистрации действий viewset.

2) Я не совсем понял, но если мои предположения верны - ответ такой же, как на первый вопрос.

О том, что вы делаете неправильно - Я не уверен, но вы пытались добавить sla sh в конце вашего запроса (т.е. не /api/blogs/1, а /api/blogs/1/)

...