Платформа DJANGO API REST: методы схемы

#django #list #rest #api #frameworks

#django #Список #rest #API #фреймворки

Вопрос:

Django 1.11.3, python 3.6

У меня есть 2 класса в моем view.py:

 class ProductList(generics.ListAPIView):

class SampleList(generics.ListAPIView):
  

Пожалуйста, обратите внимание на тот же суперкласс. Может иметь значение: Product — это фактическая модель, Sample — нет, SampleList это просто метод, который вызывает Product.objects.all() (тот же код, что и в ProductList )

Весь код внутри этих классов, кроме имен классов, ИДЕНТИЧЕН (включая сериализатор) — я просто скопировал класс и переименовал копию).

Клиент, прежде чем он попадет по URL-адресам для этих двух, получает схему

     schema = self.client.get(self.myAppApiUrl)

    #works, returns the results
    result1 = self.client.action(schema, ["products", "list"])

    params = {"id" : some_id, }

    #fails with this: coreapi.exceptions.LinkLookupError: Index ['samples']['list'] did not reference a link. Key 'list' was not found.
    result2 = self.client.action(schema, ["samples", "list"], params)
  

Когда я печатаю « schema «, я вижу

    products: {
        list([page])
    }
    samples: {
        read(id)
    }
  
  1. Мои вопросы таковы: что заставляет его добавлять "list" в schema в первом случае и "read" во втором случае? И как я могу добавить «список» ко второму случаю? Возможно, необходимо каким-то образом выполнить некоторое обновление схемы? Веб-сервер API был перезапущен.

  2. Что означает это сообщение "Key 'list' was not found" ? Имеет ли этот сбой какое-то отношение к params переданному? Удаление params из клиентского вызова ничего не меняет.

  3. Мне также несколько любопытно, что это за « page » вещь в list и что ее добавляет, но это не важно.

Комментарии:

1. Вы говорите, что Sample это не модель, и вы говорите, что SampleList это в основном список Product . Почему вы ожидаете, что ваша схема сможет отображать «образцы»? Не уверен, откуда берется ваше чтение (id), но, вероятно, у вас где-то есть Sample модель с RetrieveAPIView ?

2. предполагается, что @dirkgroten SampleList создаст пользовательский список продуктов, поэтому первый шаг — получить список продуктов таким же образом, ProductList как это делается в любом случае, а затем настроить его. Я начал с этого и получил, что «Список ключей » не найден», сюрприз.

3. Но это не должно удивлять, поскольку в модели ‘образцов’ нет представления ‘списка’.

4. @dirkgroten . Хорошо, если это ожидается, как я могу выполнить обращение к представлению от моего клиента для этого метода класса? Я не могу сделать это с помощью 'list' опции, поскольку 'list' это не опция, а только 'read' . Когда я пытаюсь, 'read' я получаю "coreapi.exceptions.NoCodecAvailable: Unsupported media in Content-Type header 'text/html" , что говорит о том, что это неправильный поступок. Может быть, есть способ реализовать list для этого класса без создания модели?

5. Вероятно, вам придется вручную указать схему для этого представления: django-rest-framework.org/api-guide/schemas /… и создайте шаблон URL для вашего представления. Обратите внимание, что это page означает, что вы можете передать page параметр запроса в вызов API, чтобы запросить определенную страницу в списке. Но если ваше представление отличается только тем, что оно фильтрует products , почему бы не добавить это в качестве параметра фильтра к первому представлению?