django-polymorphic icon indicating copy to clipboard operation
django-polymorphic copied to clipboard

AttributeError on PolymorphicQuerySet for reverse relations.

Open eriktelepovsky opened this issue 10 years ago • 4 comments

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)

eriktelepovsky avatar Jul 16 '15 09:07 eriktelepovsky

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

vdboor avatar Aug 04 '15 09:08 vdboor

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.

eriktelepovsky avatar Jan 22 '16 11:01 eriktelepovsky

Do you have a more complete code example? I'm not sure whether this is caused by us or the code example you use.

vdboor avatar Mar 08 '16 11:03 vdboor

AttributeError: 'BaseModelQuerySet' object has no attribute 'custom_method'

So it's a queryset. custom_method is defined on the model/instance level.

tomwojcik avatar Mar 18 '22 12:03 tomwojcik