djongo icon indicating copy to clipboard operation
djongo copied to clipboard

mongo_aggregate() AttributeError: 'super' object has no attribute '__getattr__'

Open pritamgb opened this issue 4 years ago • 5 comments

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'

pritamgb avatar Feb 01 '21 11:02 pritamgb

Hi I have the same error. Do you figure out how to solve it?

jcardenasc93 avatar Mar 23 '21 13:03 jcardenasc93

Hi I have the same error. Do you figure out how to solve it?

No. No solution found yet.

pritamgb avatar May 24 '21 00:05 pritamgb

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

manojmspython avatar Jul 04 '21 15:07 manojmspython

I got this issue, when use multi database.

wuyue92tree avatar Jun 26 '23 07:06 wuyue92tree

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)

wuyue92tree avatar Jun 26 '23 08:06 wuyue92tree