Skip to main content

django-qserializer

Continuos Integration Continuos Delivery

Django QSerializer started as an internal Buser project to improve our serialization process.

Database queries and serialization are two separated steps, but really ORM coupled. Relationships must be fetched from database before serialization, but Django don't have an easy way to setup that.

Start with a custom manager SerializableManager.

from django.db import models
from django_qserializer import SerializableManager


class Company(models.Model):
    name = models.CharField(max_length=64)


class Bus(models.Model):
    objects = SerializableManager()
    company = models.ForeignKey(Company, on_delete=models.SET_NULL)

A basic serializer implementation would be:

from django_qserializer import BaseSerializer


class BusSerializer(BaseSerializer):
    select_related = ['company']

    def serialize_object(self, obj):
        return {
            'id': obj.id,
            'company': {
                'name': obj.company.name,
            }
        }

Add the serializer to your queryset as:

buses = Bus.objects.to_serialize(BusSerializer).all()

for bus in buses:
    # The serialize method is bound to BusSerializer.serialize_object.
    print(bus.serialize())

API

BaseSerializer.select_related

List of model fields to add to queryset with a select_related call.

BaseSerializer.prefetch_related

List of model fields to add to queryset with a prefetch_related call.

class BusSerializer(BaseSerializer):
    prefetch_related = ['company']

    def serialize_object(self, obj):
        return {
            'id': obj.id,
            'company': {
                'name': obj.company.name,
            }
        }

BaseSerializer.prepare_queryset

Callable to change the queryset. It is possible to implement select_related and prefetch_related attributes with it, but they work together with prepare_queryset.

class BusSerializer(BaseSerializer):
    select_related = ['company']

    def prepare_queryset(self, qs):
        return qs.annotate(state=Value('broken'))

BaseSerializer.prepare_objects

Prepare objects after they are loaded to memory. Add data in bulk to them, like fetching information from cache and attaching to loaded objects.

BaseSerializer.serialize_object

Required implementation. It converts the Django model to a serializable dict. Avoid slow calls here because it will cause N+1 issues.

BaseSerializer.serialize

Execute serialize_object for each model object.

Development

To run the project, it is necessary the following tools:

To create a virtual environment, run

python3  -m venv .venv

To activate the virtual environment, run

source .venv/bin/activate

To install the project's requirements in the virtual environment, run

pip install -e .\[test\]

To deactivate the virtual environment, run deactivate.

Run the commands of the following sections with the virtual environment active.

Quality

The quality metrics of the project are reproduced by the continuos integration (CI) pipeline of the project. CI configuration in .github/workflows/ci.yml file.

Tests and linter

To run tests, coverage report and linter, run

pytest

To see the html report, check htmlcov/index.html.

Tests and coverage configuration in setup.cfg file, at [tool:pytest] section.

Linter configuration in setup.cfg file, at [flake8] section.

License

This repository is licensed under the terms of MIT License.

Metadata

Release files for django-qserializer 0.2.9

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-qserializer 0.2.9
File Size Uploaded
django_qserializer-0.2.9.tar.gz 8.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-qserializer 0.2.9
File Interpreter ABI Platform
django_qserializer-0.2.9-py3-none-any.whl Python 3 none any Details

Total release size: 17.3 kB

Release files / django_qserializer-0.2.9.tar.gz

Download URL django_qserializer-0.2.9.tar.gz
Size 8.4 kB
Tags Source
SHA-256 checksum
How to use checksums
3e576a3e1b704aa782f6ed2116e7745eb2d210d351412f17db66e32f2cdf1357
BLAKE2b-256 checksum
How to use checksums
955d062e0517aba387a90c3f50909771fe2dd081ae39b38fb6c66b2e51b2ad55
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.0.1 CPython/3.12.8

Release files / django_qserializer-0.2.9-py3-none-any.whl

Download URL django_qserializer-0.2.9-py3-none-any.whl
Size 8.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e7bc9d7561eade8186a7cbbf95fa616f64417eb4da8d1ea6998f93d441d1ce10
BLAKE2b-256 checksum
How to use checksums
15939603d0456a19047d4d71a941870823057b968be0dcbab32a5d86b88b3f1e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.0.1 CPython/3.12.8

Release history Release notifications | RSS feed

This release

0.2.9 This release

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2

2 release files

0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page