https://github.com/natural/django-objectcounters
Associate counters with Django model records.
https://github.com/natural/django-objectcounters
Last synced: about 2 months ago
JSON representation
Associate counters with Django model records.
- Host: GitHub
- URL: https://github.com/natural/django-objectcounters
- Owner: natural
- License: other
- Created: 2013-05-20T17:59:31.000Z (about 12 years ago)
- Default Branch: master
- Last Pushed: 2014-04-18T17:18:51.000Z (about 11 years ago)
- Last Synced: 2025-04-12T18:04:25.411Z (about 2 months ago)
- Language: Python
- Size: 171 KB
- Stars: 3
- Watchers: 3
- Forks: 2
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
Object Counters for Django
==========================This is a simple app for associating named integer values with
arbitrary Django model objects.Using counters allows you to keep scalar values out of your models.
Instead of this:class Person(models.Model):
name = models.CharField(...)
number_of_friends_total = models.IntegerField(...)
number_of_friends_recent = models.IntegerField(...)
number_of_friends_last_month = models.IntegerField(...)You can do this:
capt = Person.objects.get(name='Jean-Luc Picard')
Counter.objects.create_for_object('friends_total', capt, 1014)And:
last = Counter.objects.get_for_object('friends_last_month', capt)
last.value += -3 # lost the away team.
last.save()The approach of reading and writing values in a separate model allows
you to evolve some of your data without touching the models. And it
keeps your models a bit more tidy.Install
-------Pull down the app:
$ pip install django-objectcounters
Add it to your `INSTALLED_APPS`:
INSTALLED_APPS = (
...
'objectcounters'
)Sync your database:
$ ./manage.py syncdb --migrate
To run the sample app, make sure you've got generic admin installed globally
(ugh), or better yet, create a new virtual env and install it there with the
sample.Python Usage
-------------The `Counter` model is a regular Django model, so you can create, read, update
and delete records in the usual way. Additionally, the model provides a manager
with a few more methods:1. `Counter.get_for_object(name, instance, **kwargs)`
Use this method to get an existing counter for an object. Pass in the name of
the counter, like 'total-holodeck-hours', and a model instance. Keyword
arguments are passed thru to the `get()` call.2. `Counter.get_value_for_object(self, name, instance, default=0, **kwargs)`
Use this method when you need just the value of a counter and not the counter
record. Keyword arguments are passed thru to the `get()` call.3. `Counter.create_for_object(self, name, instance, value=0)`
This is just like Django's `get_or_create` and returns the same kind of
two-tuple. Use this when you need to get a counter and create it if necessary
in one step.Template Usage
--------------You can also enable counters inside of templates pretty easily.
In your templates, load the tag:
`{% load counter_tags %}`
Then you can render values like this:
{% counter_for_object "monthly_shack_visits" user as visits %}
I went to Shake Shack {{ visits }} times this month.`