Skip to main content

django-pg-returning

A small library implementing PostgreSQL ability to return rows in DML statements for Django.
Link to PostgreSQL docs

Requirements

  • Python 2.7 or Python 3.3+
  • django >= 1.7
    Previous versions may also work, but haven't been tested.
  • pytz
  • six
  • typing
  • psycopg2
  • PostgreSQL 9.2+
    Previous versions may also work, but haven't been tested.

Installation

Install via pip:
pip install django-pg-returning
or via setup.py:
python setup.py install

Usage

Integration

To use library QuerySet methods, just add UpdateReturningManager to your model:

from django.db import models
from django_pg_returning import UpdateReturningManager

class MyModel(models.Model):
    objects = UpdateReturningManager()

    field = models.IntegerField()

If you already have custom manager, you can implement get_queryset() method in it:

from django.db import models
from django_pg_returning import UpdateReturningQuerySet

class MyManager(models.Manager):
    def get_queryset(self):
        return UpdateReturningQuerySet(using=self.db, model=self.model)

class MyModel(models.Model):
    objects = MyManager()

    field = models.IntegerField()

And if you have custom manager you can use a mixin:

from django.db import models
from django_pg_returning import UpdateReturningMixin

class MyQuerySet(models.QuerySet, UpdateReturningMixin):
    pass

class MyManager(models.Manager):
    def get_queryset(self):
        return MyQuerySet(using=self.db, model=self.model)

class MyModel(models.Model):
    objects = MyManager()

    field = models.IntegerField()

Methods

After mixin is integrated with model, your QuerySet-s will have 2 additional methods:

# Any django queryset you like
qs = MyModel.objects.all()

# Update and return a ReturningQuerySet, described below
result = qs.update_returning(field=1)

# Delete data and return a ReturningQuerySet, described below
result = qs.update_returning(field=1)

By default methods get all fields, fetched by the model. To limit fields returned, you can use standard QuerySet.only() and QuerySet.defer() methods.

Important notes:

  1. If you don't fetch field, and then try to get it, library acts as django does - makes extra database query to fetch attribute deferred.
  2. These queries are not lazy, as well as basic QuerySet.update() and QuerySet.delete() methods.
  3. Primary key field is fetched not looking at limiting methods, as django needs it to form a QuerySet

ReturningQuerySet

The result of returning functions is django_pg_returning.ReturningQuerySet. It is based on django's RawQuerySet, but adds some extra methods to be used easier. The main difference is that ReturningQuerySet caches query results, while RawQuerySet executes query each time it is iterated. All ReturningQuerySet methods are not executed on database side, they are executed in python on cached result. The only way, ReturningQuerySet makes extra database query - is deferred field loading, described above. Implemented methods:

# UPDATE ... RETURNING query is executed here once. The result is cached.
result = MyModel.objects.all().update_returning(field=1)

# Get number of values fetched
print(result.count(), len(result))
# Output: 1, 1

# Index and slicing. Note that the order of result is not guaranteed by the database.
print(result[1], result[0:2])
# Output: MyModel(...), [MyModel(...), MyModel(...), MyModel(...)]

# Fetching values and values_list. Both methods use cache and return lists, not ValuesQuerySet like django does.
# values() method cakked without fields will return all fields, fetched in returning method.
# values_list() method called without fields will raise exception, as order or fields in result tuple is not obvious.

print(result.values())
# Output: [{'id': 1, 'field': 1}, {'id': 2, 'field': 2}]

print(result.values('field'))
# Output: [{'field': 1}, {'field': 2}]

print(result.values_list('field', flat=True))
# Output: [1, 2]

print(result.values_list('field', 'id', named=True))
# Output: [Row(field=1, id=1), Row(field=2, id=2)]

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-pg-returning-1.0.1.tar.gz (5.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_pg_returning-1.0.1-py2.py3-none-any.whl (6.2 kB view details)

Uploaded Python 2Python 3

File details

Details for the file django-pg-returning-1.0.1.tar.gz.

File metadata

File hashes

Hashes for django-pg-returning-1.0.1.tar.gz
Algorithm Hash digest
SHA256 7f60d7054d6cbfe7757c7c0f0da1236bf7335702f119f724693f5e94a75b7736
MD5 c84bc17b53f77410960e7e2249dab395
BLAKE2b-256 d1ea2a8b98c665b9913edd0b7594183e5fbf6f26ee32592eb9c1bf53fcf6e0b4

See more details on using hashes here.

File details

Details for the file django_pg_returning-1.0.1-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for django_pg_returning-1.0.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 157fcdcb1290b7175bb7136278d808683bad37417c82607eaf8d92c0bab361e4
MD5 80d13e00053b1e3eb717d887ed815adb
BLAKE2b-256 e224833d5f7bf5ada7c485f5afc67c56a6924ef7f1082b8af00b868c8967cd4b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page