relate anything to anything
Python CSS HTML JavaScript
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
docs Version bump Dec 3, 2011
example
genericm2m 0.3.1 Oct 27, 2016
.gitignore generic_objects can be filtered by model instance type. e.g.: pizza.r… Oct 30, 2014
LICENSE
MANIFEST.in Remove slash from manifest. Oct 27, 2016
README.rst
runtests.py
setup.py Initial commit Feb 17, 2011

README.rst

django-generic-m2m

relate anything to anything. the image below is a screenshot of the example app and shows a blog post that has been "related" to 2 "Place" models and a "City" model:

http://media.charlesleifer.com/blog/photos/genericm2m-tagging.png

check the documentation for more examples and an in-depth description of the app (or keep reading for the 30 second version).

what it does

the purpose of this project is to allow you to create database-level relationships between various objects using a consistent api.

example app

bundled with the source code is an example app which shows how generic-m2m can be used to create "tags" between models. it uses nathanborror's basic apps with django-completion (shameless plug) to allow users to "autocomplete" various relationships between models, so if I'm a user and want to create a new blog post I can tag it with relationships to objects representing a city, a place, a funny photo of a cat, etc.

http://media.charlesleifer.com/blog/photos/generic-m2m-rel-objs.png

quick overview

say you have a couple models:

class Food(models.Model):
    name = models.CharField(max_length=255)

    related = RelatedObjectsDescriptor()

    def __unicode__(self):
        return self.name


class Beverage(models.Model):
    name = models.CharField(max_length=255)

    related = RelatedObjectsDescriptor()

    def __unicode__(self):
        return self.name

Here's a sample interactive interpreter session to show the basic API:

>>> pizza = Food.objects.create(name='pizza')
>>> pepperoni = Food.objects.create(name='pepperoni')
>>> beer = Beverage.objects.create(name='beer')
>>> soda = Beverage.objects.create(name='soda')

>>> pizza.related.connect(pepperoni)
<RelatedObject: pizza related to pepperoni ("")>

>>> pizza.related.connect(beer)
<RelatedObject: pizza related to beer ("")>

>>> pepperoni.related.related_to()
[<RelatedObject: pizza related to pepperoni ("")>]

>>> pizza.related.all()
[<RelatedObject: pizza related to beer ("")>, <RelatedObject: pizza related to pepperoni ("")>]

>>> pizza.related.all().generic_objects()
[<Beverage: beer>, <Food: pepperoni>]

>>> Food.related.all()
[<RelatedObject: pizza related to beer ("")>, <RelatedObject: pizza related to pepperoni ("")>]