A pickled object field for Django

Overview

django-picklefield

License Latest Version Build Status Coverage Status Supported Python Versions Wheel Status

About

django-picklefield provides an implementation of a pickled object field. Such fields can contain any picklable objects.

The implementation is taken and adopted from Django snippet #1694 by Taavi Taijala, which is in turn based on Django snippet #513 by Oliver Beattie.

django-picklefield is available under the MIT license.

Usage

First of all, you need to have django-picklefield installed; for your convenience, recent versions should be available from PyPI.

To use, just define a field in your model:

>>> from picklefield.fields import PickledObjectField
... class SomeObject(models.Model):
...     args = PickledObjectField()

and assign whatever you like (as long as it's picklable) to the field:

>>> obj = SomeObject()
>>> obj.args = ['fancy', {'objects': 'inside'}]
>>> obj.save()

Notes

If you need to serialize an object with a PickledObjectField for transmission to the browser, you may need to subclass the field and override the value_to_string() method. Currently pickle fields are serialized as base64-encoded pickles, which allows reliable deserialization, but such a format is not convenient for parsing in the browser. By overriding value_to_string() you can choose a more convenient serialization format.

Fields now accept the boolean key word argument copy, which defaults to True. The copy is necessary for lookups to work correctly. If you don't care about performing lookups on the picklefield, you can set copy=False to save on some memory usage. This an be especially beneficial for very large object trees.

Running tests

The full test suite can be run with Tox:

>>> pip install tox
>>> tox

Original notes

Here are the notes by taavi223, the original author:

Incredibly useful for storing just about anything in the database (provided it is Pickle-able, of course) when there isn't a 'proper' field for the job.

PickledObjectField is database-agnostic, and should work with any database backend you can throw at it. You can pass in any Python object and it will automagically be converted behind the scenes. You never have to manually pickle or unpickle anything. Also works fine when querying; supports exact, in, and isnull lookups. It should be noted, however, that calling QuerySet.values() will only return the encoded data, not the original Python object.

This PickledObjectField has a few improvements over the one in snippet #513.

This one solves the DjangoUnicodeDecodeError problem when saving an object containing non-ASCII data by base64 encoding the pickled output stream. This ensures that all stored data is ASCII, eliminating the problem.

PickledObjectField will now optionally use zlib to compress (and uncompress) pickled objects on the fly. This can be set per-field using the keyword argument "compress=True". For most items this is probably not worth the small performance penalty, but for Models with larger objects, it can be a real space saver.

You can also now specify the pickle protocol per-field, using the protocol keyword argument. The default of 2 should always work, unless you are trying to access the data from outside of the Django ORM.

Worked around a rare issue when using the cPickle and performing lookups of complex data types. In short, cPickle would sometimes output different streams for the same object depending on how it was referenced. This of course could cause lookups for complex objects to fail, even when a matching object exists. See the docstrings and tests for more information.

You can now use the isnull lookup and have it function as expected. A consequence of this is that by default, PickledObjectField has null=True set (you can of course pass null=False if you want to change that). If null=False is set (the default for fields), then you wouldn't be able to store a Python None value, since None values aren't pickled or encoded (this in turn is what makes the isnull lookup possible).

You can now pass in an object as the default argument for the field without it being converted to a unicode string first. If you pass in a callable though, the field will still call it. It will not try to pickle and encode it.

You can manually import dbsafe_encode and dbsafe_decode from fields.py if you want to encode and decode objects yourself. This is mostly useful for decoding values returned from calling QuerySet.values(), which are still encoded strings.

Note: If you are trying to store other django models in the PickledObjectField, please see the comments for a discussion on the problems associated with doing that. The easy solution is to put django models into a list or tuple before assigning them to the PickledObjectField.

Update 9/2/09: Fixed the value_to_string method so that serialization should now work as expected. Also added deepcopy back into dbsafe_encode, fixing #4 above, since deepcopy had somehow managed to remove itself. This means that lookups should once again work as expected in all situations. Also made the field editable=False by default (which I swear I already did once before!) since it is never a good idea to have a PickledObjectField be user editable.

Changes

Changes in version 3.0.0

  • Allowed default pickle protocol to be overriden using the PICKLEFIELD_DEFAULT_PROTOCOL setting.
  • Dropped support for Python 2.
  • Added testing against Django 3.0.
  • Dropped support for Django 1.11.

Changes in version 2.1.0

  • Added official support for Django 2.2 (thanks to joehybird).
  • Dropped support for Django 2.0 and 2.1 (thanks to joehybird).
  • Dropped support for Python 3.4 (thanks to joehybidd).

Changes in version 2.0.0

  • Silenced RemovedInDjango30Warning warnings on Django 2.0+ (thanks to canarduck).
  • Restructured project directories.
  • Disallowed the usage of empty strings for PickledObjectField. That makes .save(), .create(), etc. raise IntegrityError if null is not True and no default value was specified like built-in fields do (thanks to Attila-Mihaly Balazs).
  • Added a check for mutable default values to PickledObjectField.

Changes in version 1.1.0

  • Added support for Django 2.1 and dropped support for Django < 1.11.

Changes in version 1.0.0

  • Added a new option to prevent a copy of the object before pickling: copy=True
  • Dropped support for Django 1.4
  • Dropped support for Django 1.7
  • Dropped support for Python 3.2
  • Added support for Python 3.6

Changes in version 0.3.2

  • Dropped support for Django 1.3.
  • Dropped support for Python 2.5.
  • Silenced deprecation warnings on Django 1.8+.

Changes in version 0.3.1

  • Favor the built in json module (thanks to Simon Charette).

Changes in version 0.3.0

  • Python 3 support (thanks to Rafal Stozek).

Changes in version 0.2.0

  • Allow pickling of subclasses of django.db.models.Model (thanks to Simon Charette).

Changes in version 0.1.9

  • Added connection and prepared parameters to get_db_prep_value() too (thanks to Matthew Schinckel).

Changes in version 0.1.8

  • Updated link to code repository.

Changes in version 0.1.7

  • Added connection and prepared parameters to get_db_prep_lookup() to get rid of deprecation warnings in Django 1.2.

Changes in version 0.1.6

Changes in version 0.1.5

  • Added support for South.
  • Changed default to null=False, as is common throughout Django.

Changes in version 0.1.4

  • Updated copyright statements.

Changes in version 0.1.3

  • Updated serialization tests (thanks to Michael Fladischer).

Changes in version 0.1.2

  • Added Simplified BSD licence.

Changes in version 0.1.1

  • Added test for serialization.
  • Added note about JSON serialization for browser.
  • Added support for different pickle protocol versions (thanks to Michael Fladischer).

Changes in version 0.1

  • First public release.

Feedback

There is a home page <http://github.com/gintas/django-picklefield> with instructions on how to access the code repository.

Send feedback and suggestions to [email protected] .

Owner
Gintautas Miliauskas
CTO / co-founder at Mavenoid
Gintautas Miliauskas
Thumbnails for Django

Thumbnails for Django. Features at a glance Support for Django 2.2, 3.0 and 3.1 following the Django supported versions policy Python 3 support Storag

Jazzband 1.6k Jan 03, 2023
a little task queue for python

a lightweight alternative. huey is: a task queue (2019-04-01: version 2.0 released) written in python (2.7+, 3.4+) clean and simple API redis, sqlite,

Charles Leifer 4.3k Dec 29, 2022
Django API that scrapes and provides the last news of the city of Carlos Casares by semantic way (RDF format).

"Casares News" API Api that scrapes and provides the last news of the city of Carlos Casares by semantic way (RDF format). Usage Consume the articles

Andrés Milla 6 May 12, 2022
A handy tool for generating Django-based backend projects without coding. On the other hand, it is a code generator of the Django framework.

Django Sage Painless The django-sage-painless is a valuable package based on Django Web Framework & Django Rest Framework for high-level and rapid web

sageteam 51 Sep 15, 2022
Django URL Shortener is a Django app to to include URL Shortening feature in your Django Project

Django URL Shortener Django URL Shortener is a Django app to to include URL Shortening feature in your Django Project Install this package to your Dja

Rishav Sinha 4 Nov 18, 2021
Application made in Django to generate random passwords as based on certain criteria .

PASSWORD GENERATOR Welcome to Password Generator About The App Password Generator is an Open Source project brought to you by Iot Lab,KIIT and it brin

IoT Lab KIIT 3 Oct 21, 2021
✋ Auto logout a user after specific time in Django

django-auto-logout Auto logout a user after specific time in Django. Works with Python 🐍 ≥ 3.7, Django 🌐 ≥ 3.0. ✔️ Installation pip install django-a

Georgy Bazhukov 21 Dec 26, 2022
Django-static-site - A simple content site framework that harnesses the power of Django without the hassle

coltrane A simple content site framework that harnesses the power of Django with

Adam Hill 57 Dec 06, 2022
Repo for All the Assignments I have to submit for Internship Application !😅

Challenges Repository for All the Assignments I have to submit for Internship Application ! 😅 As You know, When ever We apply for an Internship, They

keshav Sharma 1 Sep 08, 2022
☄️ Google Forms autofill script

lazrr 'Destroy Them With Lazers' - Knife Party, 2011 Google Forms autofill script Installation: pip3 install -r requirements.txt Usage: python3 lazrr.

Serezha Rakhmanov 12 Jun 04, 2022
Django Pickled Model

Django Pickled Model Django pickled model provides you a model with dynamic data types. a field can store any value in any type. You can store Integer

Amir 3 Sep 14, 2022
Chatbot for ordering and tracking a Pizza.

Pizza Chatbot To start the app, follow the below steps: Clone the repo using the below command: git clone Shreya Shah 1 Jul 15, 2021

Extensions for using Rich with Django.

django-rich Extensions for using Rich with Django. Requirements Python 3.6 to 3.10 supported. Django 2.2 to 4.0 supported. Are your tests slow? Check

Adam Johnson 88 Dec 26, 2022
A simple trivia quizzz web app made using django

Trivia Quizzz A simple trivia quizzz web app made using django Demo http://triviaquizzz.herokuapp.com/ & https://triviaquiz.redcrypt.xyz Features Goog

Rachit Khurana 2 Feb 10, 2022
A slick ORM cache with automatic granular event-driven invalidation.

Cacheops A slick app that supports automatic or manual queryset caching and automatic granular event-driven invalidation. It uses redis as backend for

Alexander Schepanovski 1.7k Jan 03, 2023
This Django app will be used to host Source.Python plugins, sub-plugins, and custom packages.

Source.Python Project Manager This Django app will be used to host Source.Python plugins, sub-plugins, and custom packages. Want to help develop this

2 Sep 24, 2022
A Blog Management System Built with django

Blog Management System Backend use: Django Features Enhanced Ui

Vishal Goswami 1 Dec 06, 2021
A Django Online Library Management Project.

Why am I doing this? I started learning 📖 Django few months back, and this is a practice project from MDN Web Docs that touches the aspects of Django

1 Nov 13, 2021
A Django application that provides country choices for use with forms, flag icons static files, and a country field for models.

Django Countries A Django application that provides country choices for use with forms, flag icons static files, and a country field for models. Insta

Chris Beaven 1.2k Jan 07, 2023
Customize the behavior of django.contrib.auth permissions.

Customizando o comportamento do django.contrib.auth. O que queremos? Não criar as permissões padrões automaticamente (add, delete, view, read). Criar

Henrique Bastos 7 Nov 26, 2022