Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Django 1.8.5 ORM without creating a django project?

Tags:

I've used Django ORM for one of my web-app and I'm very much comfortable with it. Now I've a new requirement which needs database but nothing else that Django offers. I don't want to invest more time in learning one more ORM like sqlalchemy.

I think I can still do
from django.db import models
and create models, but then without manage.py how would I do migration and syncing?

like image 315
swapnil jariwala Avatar asked Oct 16 '15 12:10

swapnil jariwala


People also ask

Can I use Django ORM without Django?

Django doesn't have a separate package for it's ORM, but it's still possible to use it on its own.

Does Django comes with a default ORM?

The Django web framework includes a default object-relational mapping layer (ORM) that can be used to interact with application data from various relational databases such as SQLite, PostgreSQL and MySQL. The Django ORM is an implementation of the object-relational mapping (ORM) concept.

Can you use Django without models?

Yes that is possible, but a lot of ways how Django can help with webdevelopment are based on its models. For example based on a model Django can make a ModelForm [Django-doc] to automate rendering HTML forms that map to the model, validating user input, and saving it to the database.

How do I get Django ORM?

We can access the ORM by running python manage.py shell from the main directory of our Django project. Type "help", "copyright", "credits" or "license" for more information. This will bring us into an interactive console.


1 Answers

There are a lot of answers out there that work with older versions of Django, but Django is constantly updating and in my research I found no viable answer for Django 1.8/1.9, so I had to roll my own. Here's how you do it:

Project Structure:

├── data │   ├── __init__.py │   ├── migrations │   │   └── __init__.py │   └── models.py ├── main.py ├── manage.py └── settings.py 

The data directory and migrations directory contain empty __init__.py files. The sample models.py file reads as follows:

# models.py from django.db import models  class User(models.Model):     name = models.CharField(max_length=255)     email = models.EmailField(max_length=255) 

The manage.py file is the typical Django manage.py file. Just be sure to change the settings param in os.environ.setdefault if you copy it from a fresh django-admin startproject command:

#!/usr/bin/env python # manage.py import os import sys  if __name__ == "__main__":     os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")     from django.core.management import execute_from_command_line     execute_from_command_line(sys.argv) 

The settings.py file requires 3 settings: DATABASES, INSTALLED_APPS, and SECRET_KEY. Refer to Django docs for DBs that aren't SQLite:

# settings.py DATABASES = {     'default': {         'ENGINE': 'django.db.backends.sqlite3',         'NAME': 'sqlite.db',     } }  INSTALLED_APPS = (     'data',     )  SECRET_KEY = 'REPLACE_ME' 

The real trick is in main.py, which will be where you can code against your models. Apparently you have to use wsgi to get things working with these two lines:

from django.core.wsgi import get_wsgi_application application = get_wsgi_application() 

Here's a sample main.py:

# main.py # Django specific settings import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")  ### Have to do this for it to work in 1.9.x! from django.core.wsgi import get_wsgi_application application = get_wsgi_application() #############  # Your application specific imports from data.models import *  #Add user user = User(name="someone", email="[email protected]") user.save()  # Application logic first_user = User.objects.all()[0]  print(first_user.name) print(first_user.email) 

This project along with this post were helpful starting points for me to find the answer, and my pull request with working code for Django 1.9 was merged, so you can grab the code from masnun's repo now. If you know of a better way, please submit a pull request.

like image 88
mattmc3 Avatar answered Sep 23 '22 19:09

mattmc3