Skip to main content

Stores a model as a dictionary

This project has been archived.

The maintainers of this project have marked this project as archived. No new releases are expected.

Project description

django-modeldict

https://img.shields.io/pypi/v/django-modeldict-yplan.svg https://travis-ci.org/adamchainz/django-modeldict.svg?branch=master

Retired: this project is no longer maintained. I (Adam Johnson) no longer have time to continue maintaining this. I was doing so to support gargoyle-yplan, a fork for my ex-employer YPlan. If you’d like to sponsor ongoing maintenance or take it over yourself, please contact me@adamj.eu.

ModelDict is a very efficient way to store things like settings in your database. The entire model is transformed into a dictionary (lazily) as well as stored in your cache. It’s invalidated only when it needs to be (both in process and based on CACHE_BACKEND).

It was originally created by Disqus, but due to the inactivity we at YPlan have taken over maintenance on this fork.

Requirements

Tested with all combinations of:

  • Python: 3.6

  • Django: 1.11, 2.0, 2.1, 2.2

Python 3.4+ supported.

Install

Install it with pip:

pip install django-modeldict-yplan

Make sure you pip uninstall django-modeldict first if you’re upgrading from the original to this fork - the packages clash.

Example Usage

# You'll need a model with fields to use as key and value in the dict
class Setting(models.Model):
    key = models.CharField(max_length=32)
    value = models.CharField(max_length=200)

# Create the ModelDict...
settings = ModelDict(Setting, key='key', value='value', instances=False)

# And you can treat it like a normal dict:

# Missing values = KeyError
settings['foo']
>>> KeyError

# Sets supported
settings['foo'] = 'hello'

# Fetch the current value using normal dictionary access
settings['foo']
>>> 'hello'

# ...or by normal model queries
Setting.objects.get(key='foo').value
>>> 'hello'

History

Pending release

2.0.3 (2019-05-17)

  • Retired: this project is no longer maintained. I (Adam Johnson) no longer have time to continue maintaining this. I was doing so to support gargoyle-yplan, a fork for my ex-employer YPlan. If you’d like to sponsor ongoing maintenance or take it over yourself, please contact me@adamj.eu.

2.0.2 (2019-04-28)

  • Tested with Django 2.2. No changes were needed for compatibility.

2.0.1 (2019-02-15)

  • No functional changes. This is a re-release of version 2.0.0 to fix immutable metadata on PyPI so that Pip on Python 2 doesn’t pick up the Python 3 only 2.X series. Version 2.0.0 will be pulled from PyPI on 2019-03-01.

2.0.0 (2019-01-29)

This version is due to be pulled from PyPI, please use version 2.0.1 as per its above release note.

  • Drop Python 2 support, only Python 3.4+ is supported now.

  • Drop Django 1.8, 1.9, and 1.10 support. Only Django 1.11+ is supported now.

  • Remove iteritems(), iterkeys(), and itervalues() methods from ModelDict, and move items(), keys(), and values() to Python 3 semantics, returning iterators rather than lists.

  • Include LICENSE file in wheel.

  • Tested with Django 2.1. No changes were needed for compatibility.

1.5.4 (2016-10-28)

1.5.3 (2016-09-20)

  • Stop rounding time.time() down to the nearest integer, so we are more fine grained around expiration. It might also fix a subtle timing bug around re-fetching the remote cache unnecessarily.

1.5.2 (2016-07-31)

  • Fixed update missing when _local_last_updated could be set even when it wasn’t updated

  • Fixed update missing from integer rounding in time comparison

  • Fixed CachedDict.__repr__ so it works for other subclasses of CachedDict than ModelDict (don’t assume self.model exists)

1.5.1 (2016-06-13)

  • Fixed local cache never expiring if value was checked too often.

  • Use Django’s cache.set_many for more efficient storage.

1.5.0 (2016-01-11)

  • Forked by YPlan

  • Fixed concurrency TOCTTOU bug for threaded Django servers.

  • Stopped including the ‘tests’ directory in package

  • Django 1.8 and 1.9 supported.

  • Python 3 support added.

  • Fixed setdefault() to return the value that was set/found, as per normal dict semantics. Thanks @olevinsky.

1.4.1 (2012-12-04)

  • Last release by Disqus

Supported by

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