Use Neo4j with Django!
Project description
Django Neomodel (beta!)
This module allows you to use the neo4j graph database with Django using neomodel
Getting started
Install the module:
$ pip install django_neomodel
Add the following settings to your settings.py:
NEOMODEL_NEO4J_BOLT_URL = os.environ.get('NEO4J_BOLT_URL', 'bolt://neo4j:test@localhost:7687') # Make sure django_neomodel comes before your own apps INSTALLED_APPS = ( # django.contrib.auth etc 'django_neomodel', 'yourapp' )
Write your first node definition in yourapp/models.py:
from neomodel import StructuredNode, StringProperty, DateProperty class Book(StructuredNode): title = StringProperty(unique_index=True) published = DateProperty()
Create any constraints or indexes for your labels. This needs to be done after you change your node definitions much like manage.py migrate:
$ python manage.py install_labels
Now in a view yourapp/views.py:
from .models import Book def get_books(request): return render('yourapp/books.html', request, {'books': Book.nodes.all()})
And you’re ready to go. Don’t forget to check the neomodel documentation.
Model forms
Switch the base class from StructuredNode to DjangoNode and add a ‘Meta’ class:
from datetime import datetime from django_neomodel import DjangoNode from neomodel import StructuredNode, StringProperty, DateTimeProperty, UniqueIdProperty class Book(DjangoNode): uid = UniqueIdProperty() title = StringProperty(unique_index=True) status = StringProperty(choices=( ('Available', 'A'), ('On loan', 'L'), ('Damaged', 'D'), ), default='Available') created = DateTimeProperty(default=datetime.utcnow) class Meta: app_label = 'library'
Create a model form class for your DjangoNode:
class BookForm(ModelForm): class Meta: model = Book fields = ['title', 'status']
This class may now be used just like any other Django form.
Settings
The following config options are available in django settings (default values shown). These are mapped to neomodel.config as django is started:
NEOMODEL_NEO4J_BOLT_URL = 'bolt://neo4j:neo4j@localhost:7687' NEOMODEL_SIGNALS = True NEOMODEL_FORCE_TIMEZONE = False NEOMODEL_MAX_CONNECTION_POOL_SIZE = 50
Signals
Signals work with DjangoNode sub-classes:
from django.db.models import signals from django_neomodel import DjangoNode from neomodel import StringProperty class Book(DjangoNode): title = StringProperty(unique_index=True) def your_signal_func(sender, instance, signal, created): pass signals.post_save.connect(your_signal_func, sender=Book)
The following are supported: pre_save, post_save, pre_delete, post_delete. On freshly created nodes created=True in the post_save signal argument.
Testing
You can create a setup method which clears the database before executing each test:
from neomodel import db, clear_neo4j_database class YourTestClass(DjangoTestCase): def setUp(self): clear_neo4j_database(db) def test_something(self): pass
Management Commands
The following django management commands have been included.
install_labels
Setup constraints and indexes on labels for your node definitions. This should be executed after any schema changes:
$ python manage.py install_labels Setting up labels and constraints... Found tests.someapp.models.Book + Creating unique constraint for title on label Book for class tests.someapp.models.Book Finished 1 class(es).
clear_neo4j
Delete all nodes in your database, warning there is no confirmation!
Requirements
Python 3.6+
neo4j 3.5+
Docker Example
Using Docker Compose.
Commands to setup Docker Container docker-entrypoint.sh:
# Go to tests $ cd tests/ # Docker Command (Make sure Docker is running and up to date) $ docker-compose up # login in admin with username=admin password=1234
To Contribute
Setup neo4j Desktop with a local database with password ‘foobar’ and version 4.1.2 (current version when this was written).
Commands to run tests:
# create local venv and install dependencies. $ python3 -m venv venv; source venv/bin/activate; python setup.py develop; export DJANGO_SETTINGS_MODULE=tests.settings; # Go to tests $ cd tests/ $ ./manage.py install_labels $ ./manage.py migrate $ pytest # example output: platform darwin -- Python 3.9.0, pytest-6.1.2, py-1.9.0, pluggy-0.13.1 pick 0900469 Neo4J-update-t-4.1 collected 16 items someapp/tests/test_atomicity.py . [ 6%] someapp/tests/test_commands.py .. [ 18%] someapp/tests/test_model_form.py ........... [ 87%] someapp/tests/test_sanity.py . [ 93%] someapp/tests/test_signals.py . 16 passed, 11 warnings in 1.62s
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file django_neomodel-0.0.7.tar.gz
.
File metadata
- Download URL: django_neomodel-0.0.7.tar.gz
- Upload date:
- Size: 11.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.1 importlib_metadata/2.0.0 pkginfo/1.7.0 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3007811435ae5f5ac4562603f1b5bb3d0519941bb302c8072429da36d592eb7d |
|
MD5 | 299ab69222f6cbbc5f1993eb5922d91c |
|
BLAKE2b-256 | 02a6757fdbc37d7ad0e59137e85c6fa5725fc0f3d2e5c62d33034ec30c4109eb |
File details
Details for the file django_neomodel-0.0.7-py3-none-any.whl
.
File metadata
- Download URL: django_neomodel-0.0.7-py3-none-any.whl
- Upload date:
- Size: 14.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.1 importlib_metadata/2.0.0 pkginfo/1.7.0 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 91b6514aec6bbe9a6cdab8666ec190ebc66bebb9e4a0ab27cc9e6c40c203c9d5 |
|
MD5 | b63331d25a4b9277563d3d4a6feb5b5e |
|
BLAKE2b-256 | be5ce8a5f2d9ff9e3d3df105c950164e7b071263489396c40948a17dbf38dfaf |