====== Django API ======
**General Information**
Interacting with the Django Python API.
API Reference: https://docs.djangoproject.com/en/1.11/ref/models/querysets/
**Checklist**
* [[django_install|Django Installed]]
* [[django_configuration|Django Configured]]
----
====== Imports and Settings ======
Imports and settings to add to your Python script in order to use your Django App's built in API.
\\
Import and Settings
#!/usr/bin/python
# Required module for sys.path.append
import sys
# Required module for os.environ
import os
# Import Django WSGI App Loading capabilities
from django.core.wsgi import get_wsgi_application
##- Configure Django Settings to point to your App -##
# sys.path = where manage.py is
sys.path.append('/home/django/myprojecthere')
# Settings Module = projectname.settings
os.environ["DJANGO_SETTINGS_MODULE"] = 'myprojecthere.settings'
application = get_wsgi_application()
# Import Django App Model (from 'myapphere' app)
from myapphere.models import AssetEntry
----
====== Using Your Apps API ======
Different ways to get your app data.
===== Load Objects ====
Objects can be retrieved just like in views.py.
Field lookup reference: https://docs.djangoproject.com/en/1.11/ref/models/querysets/#field-lookups
\\
**Load All Objects**
# Load all assets (just like in views.py)
asset_list = AssetEntry.objects.order_by('asset_type', 'asset_env', 'asset_name')
# Print all names (see your models.py for available fields)
for node in asset_list:
print(node.asset_name)
\\
**Load Multiple Objects that Match a filter**
# Load with a filter on device type (get all servers)
asset_list = AssetEntry.objects.filter(asset_type__iexact="servers")
# Print all retrieved objects
for node in asset_list:
print("-> Node Name is: " + node.asset_name)
print("Device Type is: " + node.asset_type)
\\
**Load Single Object**
# Load single object
single_asset = AssetEntry.objects.get(asset_name__iexact="server99")
# Print the name and os
print("Single Asset: " + single_asset.asset_name + " (OS: " + single_asset.asset_os + ")")
===== Add New Objects ====
Create a new object and then save it to the database.
\\
**Two Steps: Create object and then save it to the database**
# Set variables that will be used to create a new object
new_name = "server99"
new_type = "Servers"
new_description = "API Added Server"
new_env = "Prod"
new_os = "CentOS 7"
new_hardware = "Virtual"
# Create the new object
new_entry = AssetEntry(asset_name = new_name, asset_type = new_type, asset_description = new_description, asset_env = new_env, asset_os = new_os, asset_hardware = new_hardware)
# Attempt to add new object to the database
try:
new_entry.save()
print("--> Entry added successfully.")
except:
print("---> ERROR adding entry!")
\\
**One Step: Create object in the database**
# Set variables that will be used to create a new object
new_name = "server99"
new_type = "Servers"
new_description = "API Added Server"
new_env = "Prod"
new_os = "CentOS 7"
new_hardware = "Virtual"
# Create the new object directly
new_entry = AssetEntry.objects.create(asset_name = new_name, asset_type = new_type, asset_description = new_description, asset_env = new_env, asset_os = new_os, asset_hardware = new_hardware)
----
===== Change Existing Objects ====
Changing an existing object in the database.
# Load all assets (just like in views.py)
asset_list = AssetEntry.objects.order_by('asset_type', 'asset_env', 'asset_name')
# Change server99's OS to Ubuntu 18.04
for node in asset_list:
if node.asset_name == "server99":
node.asset_os = "Ubuntu 18.04"
# Attempt to save object change to the database
try:
node.save()
print("--> Change saved successfully.")
except:
print("---> ERROR saving change!")
----
===== Delete Objects ====
Deleting objects using the API.
# Retrieve a single object
single_asset = AssetEntry.objects.get(asset_name__iexact="server99")
# Delete the object
single_asset.delete()
----