#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)
}
-
Мои вопросы таковы: что заставляет его добавлять
"list"
вschema
в первом случае и"read"
во втором случае? И как я могу добавить «список» ко второму случаю? Возможно, необходимо каким-то образом выполнить некоторое обновление схемы? Веб-сервер API был перезапущен. -
Что означает это сообщение
"Key 'list' was not found"
? Имеет ли этот сбой какое-то отношение кparams
переданному? Удалениеparams
из клиентского вызова ничего не меняет. -
Мне также несколько любопытно, что это за «
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
, почему бы не добавить это в качестве параметра фильтра к первому представлению?