mirror of
https://github.com/balkian/gists.git
synced 2024-11-22 01:32:29 +00:00
40 lines
1.3 KiB
Python
40 lines
1.3 KiB
Python
|
class SubclassingQuerySet(QuerySet):
|
||
|
def __getitem__(self, k):
|
||
|
result = super(SubclassingQuerySet, self).__getitem__(k)
|
||
|
if isinstance(result, models.Model):
|
||
|
return result.as_leaf_class()
|
||
|
else:
|
||
|
return result
|
||
|
|
||
|
def __iter__(self):
|
||
|
for item in super(SubclassingQuerySet, self).__iter__():
|
||
|
yield item.as_leaf_class()
|
||
|
|
||
|
|
||
|
class ObjectManager(models.Manager):
|
||
|
def get_query_set(self):
|
||
|
return SubclassingQuerySet(self.model)
|
||
|
|
||
|
def get(self, *args, **kwargs):
|
||
|
obj = super(ObjectManager, self).get(*args, **kwargs)
|
||
|
return obj.as_leaf_class()
|
||
|
|
||
|
|
||
|
class MyObject(models.Model):
|
||
|
name = models.CharField(max_length=255, verbose_name=_("Name"), blank=True, null=True, editable=True)
|
||
|
content_type = models.ForeignKey(ContentType, editable=False, null=True)
|
||
|
objects = ObjectManager()
|
||
|
|
||
|
|
||
|
def save(self, *args, **kwargs):
|
||
|
if(not self.content_type):
|
||
|
self.content_type = ContentType.objects.get_for_model(self.__class__)
|
||
|
super(Device, self).save(*args, **kwargs)
|
||
|
|
||
|
def as_leaf_class(self):
|
||
|
content_type = self.content_type
|
||
|
model = content_type.model_class()
|
||
|
if (model == Device):
|
||
|
return self
|
||
|
return model.objects.get(id=self.id)
|