Categories
code git

Import data into database – django app

Steps to import data into your Django app

So you have a Django app and want to load data from a URL, a CSV file or a JSON file, I got you 🙂
First, create your models, make migrations, migrate and all that setup you have to do, but I’m sure you got all that covered 😉

See it on Github here: https://github.com/NEbere/data-import/tree/master

Import from URL:

This code gets data from a URL, be sure to have requests installed or any other HTTP library of choice.

"""
Import json data from URL to Datababse
"""
import requests
import json
from import_data.models import Movie #Import your model here
from django.core.management.base import BaseCommand
from datetime import datetime

IMPORT_URL = 'https://jsonplaceholder.typicode.com/photos' # URL to import from

class Command(BaseCommand):
  def import_movie(self, data):
  title = data.get('title', None)
  url = data.get('url', None);
  release_year = datetime.now()
  try: #try and catch for saving the objects
    movie, created = Movie.objects.get_or_create(
    title=title,
    url=url,
    release_year=release_year
    )
    if created:
      movie.save()
     display_format = "\nMovie, {}, has been saved.
     print(display_format.format(movie))
  exceptExceptionas ex:
    print(str(ex))
    msg = "\n\nSomething went wrong saving this movie: {}\n{}".format(title, str(ex))
    print(msg)
  def handle(self, *args, **options):
  """
  Makes a GET request to the API.
  """
  headers = {'Content-Type': 'application/json'}
  response = requests.get(
  url=IMPORT_URL,
  headers=headers,
  )
  response.raise_for_status()
  data = response.json()
  for data_object in data:
  self.import_movie(data_object)

Import from files (JSON):

To import from a file, read the file location

import os # Add os import to the imports used above for URL
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #Define BASE_DIR or import of it is previously defined
class Command(BaseCommand):
  def import_movie_from_file(self): 
   data_folder = os.path.join(BASE_DIR, 'import_data', 'resources/json_file')
   for data_file in os.listdir(data_folder):
     withopen(os.path.join(data_folder, data_file), encoding='utf-8') as data_file:
       data = json.loads(data_file.read())
       for data_object in data:
         title = data_object.get('title', None)
         url = data_object.get('url', None)
         release_year = datetime.now()
         # Use the try and catch used above here as it's the same model
 def handle(self, *args, **options):
 """
 Call the function to import data
 """
 self.import_movie_from_file() # call the import function in handle

Import from files (CSV):

To import from a csv uses the same steps defined for JSON file import above with the difference been importing csv, and how the data is parsed.

import csv # Add csv import to the imports used above for JSON import
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #Define BASE_DIR or import of it is previously defined
class Command(BaseCommand):
  def import_movie_from_csv_file(self): 
   data_folder = os.path.join(BASE_DIR, 'import_data', 'resources/csv_file') # folder where csv file is stored
   for data_file in os.listdir(data_folder):
     withopen(os.path.join(data_folder, data_file), encoding='utf-8') as data_file:
       data = json.loads(data_file.read())
       for data_object in data:
         title = data_object[1] # the value at index 0 is the ID and we dont need that here
         url = data_object[2]
         release_year = datetime.now()
         # Use the try and catch used above here as it's the same model
 def handle(self, *args, **options):
 """
 Call the function to import data
 """
 self.import_movie_from_csv_file() # call the import function in handle

Run the import commands

 python manage.py import_from_url # import_from_url is the name of the file where the command is defined without the extension, that is, .py

for more about requests http://docs.python-requests.org/en/master/

Again, here is the github repo with all the import scripts and sample files:
https://github.com/NEbere/data-import/tree/master
Happy coding 🙂