djongo
djongo copied to clipboard
mongo_aggregate() AttributeError: 'super' object has no attribute '__getattr__'
One line description of the issue
When accessing pymongo functions getting AttributeError: 'super' object has no attribute 'getattr'
Python script
# My model
from djongo import models
class Click(models.Model):
_id = models.ObjectIdField()
page = models.CharField(max_length=255)
section = models.CharField(max_length=255)
click = models.CharField(max_length=255)
count = models.IntegerField()
visitors = models.ForeignKey(Visitor, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True, null=True, blank=True)
updated_at = models.DateTimeField(auto_now=True, null=True, blank=True)
objects = models.DjongoManager()
class Meta:
db_table = "clicks"
# Aggregation Code
pipeline = [
{
"$group": {
"_id": {
"page": "$page",
"section": "$section",
"click": "$click",
},
"totalClicks": {"$sum": "$count"},
}
},
{
"$group": {
"_id": "$_id.page",
"sections": {
"$push": {
"section": "$_id.section",
"click": "$_id.click",
"totalClicks": "$totalClicks",
},
},
}
},
{"$project": {"page": "$_id", "_id": 0, "data": "$sections"}},
{
"$sort": {
"page": 1,
}
},
]
Click.objects.mongo_aggregate(pipeline).using("mongodb")
Traceback
Traceback (most recent call last): File "/Users/Pritam/Documents/DjangoWorkspace/tracking-admin/backend/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner response = get_response(request) File "/Users/Pritam/Documents/DjangoWorkspace/tracking-admin/backend/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response response = self.process_exception_by_middleware(e, request) File "/Users/Pritam/Documents/DjangoWorkspace/tracking-admin/backend/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/Users/Pritam/Documents/DjangoWorkspace/tracking-admin/backend/venv/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view return view_func(*args, **kwargs) File "/Users/Pritam/Documents/DjangoWorkspace/tracking-admin/backend/venv/lib/python3.8/site-packages/rest_framework/viewsets.py", line 125, in view return self.dispatch(request, *args, **kwargs) File "/Users/Pritam/Documents/DjangoWorkspace/tracking-admin/backend/venv/lib/python3.8/site-packages/rest_framework/views.py", line 509, in dispatch response = self.handle_exception(exc) File "/Users/Pritam/Documents/DjangoWorkspace/tracking-admin/backend/venv/lib/python3.8/site-packages/rest_framework/views.py", line 469, in handle_exception self.raise_uncaught_exception(exc) File "/Users/Pritam/Documents/DjangoWorkspace/tracking-admin/backend/venv/lib/python3.8/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception raise exc File "/Users/Pritam/Documents/DjangoWorkspace/tracking-admin/backend/venv/lib/python3.8/site-packages/rest_framework/views.py", line 506, in dispatch response = handler(request, *args, **kwargs) File "/Users/Pritam/Documents/DjangoWorkspace/tracking-admin/backend/apps/websites/views.py", line 192, in collective_click_data result = Click.objects.mongo_aggregate(pipeline) File "/Users/Pritam/Documents/DjangoWorkspace/tracking-admin/backend/venv/lib/python3.8/site-packages/djongo/models/fields.py", line 69, in getattr return getattr(self._client, name) File "/Users/Pritam/Documents/DjangoWorkspace/tracking-admin/backend/venv/lib/python3.8/site-packages/djongo/models/fields.py", line 71, in getattr return super().getattr(name) AttributeError: 'super' object has no attribute 'getattr'
Hi I have the same error. Do you figure out how to solve it?
Hi I have the same error. Do you figure out how to solve it?
No. No solution found yet.
Hi Do you use multiple databases? when you are facing this issue. I faced this issue and digged little deeper and found the issue is not with the module as such. But the way we are writing the code. Look into the dbrouter section you will get the answer there
I got this issue, when use multi database.
I do some debugger and found that, when call objects.using("mongodb"), It's return a QuerySet objects.
This is my solution, by extend DjongoManager
from djongo import models
class MongoManager(models.DjongoManager):
def __init__(self):
super().__init__()
# the mongo database name in settings.py
self._db = 'mongodb'
class PositionPool(models.Model):
_id = models.ObjectIdField()
...
objects = MongoManager()
class Meta:
db_table = 'position_pool'
# call pymongo function here
pipeline = [...]
PositionPool.objects.mongo_aggregate(pipeline)