Use SQL Join with Django ORM models having no relations.
Project description
django-join-unrelated
Use SQL Join with Django ORM models having no relations.
If you have models in your project that share the same data but have no relations, you might face a situation when you need to join them. But Django does not provide this functionality yet.
With django-join-unrelated
you can do the following
(models defined here):
from app.core.models import Jedi, Person
Person.objects.create(first_name='Padme', last_name='Amidala', birth_place='Naboo')
Person.objects.create(first_name='Obi-Wan', last_name='Kenobi', birth_place='Stewjon')
Jedi.objects.create(first_name='Obi-Wan', last_name='Kenobi', force=100)
Jedi.objects.create(first_name='Mace', last_name='Windu', force=80)
Jedi.objects.join(first_name=Person.first_name).values_list('first_name')
# <UnrelatedJoinQuerySet [('Obi-Wan',)]>
print(Jedi.objects.join(first_name=Person.first_name).values_list('first_name').query)
# SELECT "core_jedi"."first_name" FROM "core_jedi" INNER JOIN core_person ON ("core_jedi"."first_name" = core_person."first_name")
# Set join type explicitly
from django_join_unrelated import JoinType
Jedi.objects.join(first_name=Person.first_name, join_type=JoinType.FULL)
# Join on multiple fields
Jedi.objects.join(first_name=Person.first_name, last_name=Person.last_name)
# Join multiple models
Jedi.objects.join(first_name=Person.first_name, id=User.id)
django-join-unrelated
tries to keep all QuerySet power where it is possible:
Jedi.objects.join(first_name=Person.first_name).filter(last_name='Kenobi')
# <UnrelatedJoinQuerySet [<Jedi: Obi-Wan Kenobi>]>
Jedi.objects.join(first_name=Person.first_name).annotate(name=F('first_name'))[0].name
# 'Obi-Wan'
Jedi.objects.join(first_name=Person.first_name).aggregate(Sum('force'))
# {'force__sum': 100}
Installation
You can install django-join-unrelated
using pip:
pip install django-join-unrelated
Usage
Just import UnrelatedJoinManager
and set it as an attribute to your models:
from django.db import models
from django_join_unrelated import UnrelatedJoinManager
class Jedi(models.Model):
first_name = models.CharField('First name', max_length=128)
last_name = models.CharField('Last name', max_length=128)
force = models.IntegerField('Force')
objects = UnrelatedJoinManager()
class Meta:
verbose_name = 'Jedi'
Already implemented:
- filtering via joins
Not implemented yet but planned:
- unrelated objects selection
- return of joined values
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
Close
Hashes for django-join-unrelated-0.2.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 434b611d9fa1163711a47861c289de7c6c5f27aa1299d52ef94111085a75c710 |
|
MD5 | dec00a4d41561804b6461cb38af1db07 |
|
BLAKE2b-256 | e771a570880ea4161adc360447a9523fb1a7d91371aaa3c593dfa159d2d21a1a |
Close
Hashes for django_join_unrelated-0.2.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | fe0b23e246ebdb700eae03b8f22c83da877ea501fcb205ba5fc06b09b2448b85 |
|
MD5 | cb2dde2b8fbaedd24d7f275b623e6770 |
|
BLAKE2b-256 | 8064589a8b5e3caed840ad723c1699279088817915229ec00aa5af571f917520 |