Skip to content

Instantly share code, notes, and snippets.

@zmsmith
Created August 20, 2010 14:06
Show Gist options
  • Save zmsmith/540384 to your computer and use it in GitHub Desktop.
Save zmsmith/540384 to your computer and use it in GitHub Desktop.
from django.db.models.fields.related import ReverseManyRelatedObjectsDescriptor
from django.db.models import ManyToManyField
class NewReverseManyRelatedObjectsDescriptor(ReverseManyRelatedObjectsDescriptor):
def make_id_list(self, obj):
through = self.field.rel.through
name = self.field.m2m_field_name()
related_name =self.field.m2m_reverse_field_name()
def id_list():
return through._default_manager.filter(**{name:obj.id}).values_list(related_name, flat=True)
return id_list
def __get__(self, instance, instance_type=None):
manager = super(NewReverseManyRelatedObjectsDescriptor, self).__get__(instance, instance_type=None)
new_func = self.make_id_list(instance)
setattr(manager, "id_list", new_func)
return manager
class NewManyToManyField(ManyToManyField):
def contribute_to_class(self, cls, name):
super(NewManyToManyField, self).contribute_to_class(cls, name)
setattr(cls, self.name, NewReverseManyRelatedObjectsDescriptor(self))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment