Импорт данных из Google API в мою базу данных - PullRequest
1 голос
/ 27 июня 2019

Мне нужно создать представление, которое импортирует данные из API книг Google и сохраняет их в моей модели.Пока у меня есть такая точка зрения, но я не знаю, как это сделать в Django, и я не знаю, хорошо ли это и что будет дальше.

def book_search(self, request):
    value = ''
    apikey = ''
    params = {'q': value, 'key': apikey}
    response = request.get('https://www.googleapis.com/books/v1/volumes', params=params)
    bookapi = response.json()

<< <strong>Actualization >>

Хорошо, я попытался построить свое представление, но теперь я получаю ошибку:

AttributeError: у объекта 'NoneType' нет атрибута 'split'

Когда я пытаюсьзапустить мой взгляд.Я получаю свою форму, но когда я пытаюсь выполнить запрос POST для заполненной формы, я получаю сообщение об ошибке.

просмотров:

class GoogleBooks(View):
    model = Book
    form_class = SearchBookForm
    template_name = 'books/import_book.html'

    def get(self, request, *args, **kwargs):
        form = self.form_class()
        return render(request, self.template_name, {'form': form})

    def search(self, value):
        googleapikey = ""
        params = {"q": value, 'key': googleapikey}
        google_books = self.request.get(url="https://www.googleapis.com/books/v1/volumes", params=params)
        book_dict = google_books.json()
        return book_dict

    def post(self, request, *args, **kwargs):
        form = self.form_class(self.request.POST)
        if form.is_valid():
            text = form.cleaned_data['key_word']
            bookshelf = self.search(text)
            booklist = 0
            for book in bookshelf:
                new_book = Book.objects.create(
                    title=book['items'][booklist]['volumeInfo']['title'],
                    published_date=book['items'][booklist]['volumeInfo']['publishedDate'][:3],
                    pages=book['items'][booklist]['volumeInfo']['pageCount'],
                    language=book['items'][booklist]['volumeInfo']['language'],
                )
                booklist += 1
                new_book.save()
            return redirect(reverse('books_index'))
        else:
            return redirect(reverse('add_book'))

формы:

class SearchBookForm(forms.Form):
    key_word = forms.CharField()

template:

{% extends "books/base.html" %}
{% load bootstrap %}
{% block content %}
    <form method="GET">
            {{ form.as_p}}
            <button type="Submit" class="btn btn-primary">Search</button>
        </form>
{% endblock %}

Это то, что я пытался найти проблему, но это работает очень хорошо, и я получаю именно то, что я хочу:

import os
import requests
import json

class gbooks():
    googleapikey=""

    def search(self, value):
        params = {"q":value, 'key':self.googleapikey}
        r = requests.get(url="https://www.googleapis.com/books/v1/volumes", params=params)
        rj = r.json()
        j = rj['items'][1]['volumeInfo']['publishedDate'][:4]
        return print(j)



bk = gbooks()
bk.search("Harry Potter")

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Если вы до сих пор получаете ваш API response без ошибок.Затем вы можете выполнить цикл по bookapi и сохранить значения каждого объекта в Model, как требуется.

Для иллюстрации.

PS: для этой иллюстрации я предполагаю, что bookapi является итеративным(эта ссылка https://docs.python.org/3/library/json.html будет полезна в случае возникновения проблем при работе с api ответами json)

        .....................
        .....................
        response = request.get('https://www.googleapis.com/books/v1/volumes', params=params)
        bookapi = response.json()
        # loop through your data and save to model
        for i in bookapi:
            new_entry = Model(
                         field_1 = i['obj_key1'],
                         field_1 = i['obj_key1']
                         )
            new_entry.save()
0 голосов
/ 28 июня 2019

Хорошо, я после долгой битвы обнаружил проблему и написал полностью функциональный вид:

class GoogleBooks(View):
    form_class = SearchBookForm
    template_name = 'books/import_book.html'

    def get(self, request, *args, **kwargs):
        form = self.form_class()
        return render(request, self.template_name, {'form': form})

    def search(self, value):
        googleapikey = ""
        params = {'q': value, 'key': googleapikey}
        google_books = requests.get(url="https://www.googleapis.com/books/v1/volumes", params=params)
        books_json = google_books.json()
        bookshelf = books_json['items']
        return bookshelf

    def add_book_to_library(self, bookshelf):
        for book in bookshelf:
            Book.objects.get_or_create(
                title=book['volumeInfo']['title'],
                published_date=book['volumeInfo']['publishedDate'][:4],
                pages=book['volumeInfo']['pageCount'],
                language=book['volumeInfo']['language'],
            )

    def post(self, request, *args, **kwargs):
        form = self.form_class(self.request.POST)
        if form.is_valid():
            keyword = form.cleaned_data['keyword']
            books = self.search(keyword)
            self.add_book_to_library(books)
            return HttpResponseRedirect(reverse_lazy('index_books'))

        return reverse_lazy('import_books')

Это именно то, что я хочу, и проблема заключалась в том, что я пытался извлечь из словаря неправильные значения. Я пытался до этого:

google_books = self.request.get(url="https://www.googleapis.com/books/v1/volumes", params=params)
        book_dict = google_books.json()
        return book_dict

booklist = 0
for book in bookshelf:
    new_book = Book.objects.create(
    title=book['items'][booklist]['volumeInfo']['title'],

но должно быть так:

google_books = requests.get(url="https://www.googleapis.com/books/v1/volumes", params=params)
        books_json = google_books.json()
        bookshelf = books_json['items']
        return bookshelf

for book in bookshelf:
            Book.objects.get_or_create(
                title=book['volumeInfo']['title'],
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...