django-polymorphic
django-polymorphic copied to clipboard
AttributeError on PolymorphicQuerySet for reverse relations.
Hi, I am struggling with following exception when calling custom method on PolymorphicQuerySet within reverse related queryset:
AttributeError: 'PolymorphicQuerySet' object has no attribute 'custom_method'
Managers/Querysets:
class BaseModelQuerySet(PolymorphicQuerySet):
def custom_method(self):
return self.filter(...)
Models:
class BaseModel(PolymorphicModel):
objects = BaseModelQuerySet.as_manager()
class MyModel(BaseModel):
standard_model = models.ForeignKey(StandardModel)
class StandardModel(models.Model):
....
View:
# This throws AttributeError exception
print standard_model.mymodel_set.custom_method()
# but this works:
MyModel.objects.filter(standard_model=standard_model).custom_method()
Note:
I also tried to set BaseModelQuerySet as objects manager for MyModel, but same exception appears. And I tried to set manager as PolymorphicManager(BaseModelQuerySet) too.
Any ideas? Thank you.
(using Django 1.8.3, Python 2.7.6, django-polymorphic 0.7.1)
We didn't look into the new as_manager() logic yet, so it could be that this is causing the issues here.
The classic approach we took is:
class BaseModelQuerySet(PolymorphicQuerySet):
def custom_method(self):
return self.filter(...)
class BaseModelManager(PolymorphicManager):
queryset_class = BaseModelQuerySet
class BaseModel(PolymorphicModel):
objects = BaseModelManager()
and you can use this as workaround until as_manager() is implemented for our querysets
I see you added as_manager() support, which is great, but it does not work for me either with version 0.8.1.
I tried
objects = BaseModelQuerySet.as_manager()
and also
objects = PolymorphicManager.from_queryset(BaseModelQuerySet)()
but when I call BaseModel.objects.custom_method() I still get AttributeError: 'BaseModelQuerySet' object has no attribute 'custom_method'. Any advice? Thanks.
Do you have a more complete code example? I'm not sure whether this is caused by us or the code example you use.
AttributeError: 'BaseModelQuerySet' object has no attribute 'custom_method'
So it's a queryset. custom_method is defined on the model/instance level.