Importing data from google api to my database

Viewed 791

I need to create view which imports data from google books api and saves in my model. For now I have this view but I have no idea how to do this in Django and I don't know if this is good and what's next.

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()

<<Actualization>>

Ok I tried to built my view but now Im getting error:

AttributeError: 'NoneType' object has no attribute 'split'

When I'm trying to run my view. I'm receiving my form but when I try to execute POST request for filled form then I'm receiving error.

views:

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'))

forms:

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 %}

This is what i tried to find problem but this works very well and I'm getting exactly what I want:

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 Answers

If you so far you're getting your api response without errors. You can then loop through your bookapi and save each object values to your Model as required.

To illustrate.

PS: For this illustration, I assume bookapi is iterable ( this link https://docs.python.org/3/library/json.html would be helpful in case you run into any problem with working with api json responses )

        .....................
        .....................
        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()

Ok, I after long battle I found problem and wrote fully functional view:

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')

It's doing exactly what I want and problem was that I were trying to pull out from dictionary wrong values. I tried before this:

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'],

but should be like this:

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'],
Related