3

Facing issue with mongo_aggregate(). Below is the stacktrace.

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__'

models.py

from djongo import models


class VisitorOnline(models.IntegerChoices):
    NO = 0, "No"
    YES = 1, "Yes"


class Location(models.Model):
    ip = models.CharField()
    version = models.CharField(null=True, blank=True)
    city = models.CharField(null=True, blank=True)
    region = models.CharField(null=True, blank=True)
    region_code = models.CharField(null=True, blank=True)
    country = models.CharField(null=True, blank=True)
    country_name = models.CharField(null=True, blank=True)
    country_code = models.CharField(null=True, blank=True)
    country_code_iso3 = models.CharField(null=True, blank=True)
    country_capital = models.CharField(null=True, blank=True)
    country_tld = models.CharField(null=True, blank=True)
    continent_code = models.CharField(null=True, blank=True)
    in_eu = models.BooleanField(null=True, blank=True)
    postal = models.CharField(null=True, blank=True)
    latitude = models.FloatField(null=True, blank=True)
    longitude = models.FloatField(null=True, blank=True)
    timezone = models.CharField(null=True, blank=True)
    utc_offset = models.CharField(null=True, blank=True)
    country_calling_code = models.CharField(null=True, blank=True)
    currency = models.CharField(null=True, blank=True)
    currency_name = models.CharField(null=True, blank=True)
    languages = models.CharField(null=True, blank=True)
    country_area = models.IntegerField(null=True, blank=True)
    country_population = models.IntegerField(null=True, blank=True)
    asn = models.CharField(null=True, blank=True)
    org = models.CharField(null=True, blank=True)

    class Meta:
        abstract = True


class DeviceInfo(models.Model):
    device_type = models.CharField()
    device = models.CharField()
    platform = models.CharField()
    browser = models.CharField()
    useragent = models.CharField()
    isRobot = models.BooleanField(default=False)

    class Meta:
        abstract = True


# Create your models here.
class Visitor(models.Model):
    _id = models.ObjectIdField()
    website_id = models.IntegerField()
    uid = models.CharField(max_length=40, unique=True)
    ip = models.CharField(max_length=20)
    deviceInfo = models.EmbeddedField(model_container=DeviceInfo)
    location = models.EmbeddedField(model_container=Location)
    is_online = models.IntegerField(
        default=VisitorOnline.YES, choices=VisitorOnline.choices
    )
    currentPage = models.CharField(max_length=255, null=True, blank=True)
    currentSection = models.CharField(max_length=255, null=True, blank=True)
    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 = "visitors"


class Visit(models.Model):
    _id = models.ObjectIdField()
    page = models.CharField(max_length=255)
    section = models.CharField(max_length=255)
    time = 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().using("mongodb")

    class Meta:
        db_table = "visits"


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"


class Campaign(models.Model):
    _id = models.ObjectIdField()
    url = models.CharField(max_length=255)
    source = models.CharField(max_length=255)
    medium = models.CharField(max_length=255)
    campaign = models.CharField(max_length=255)
    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 = "campaigns"

views.py

def collective_click_data(self, request, slug):
        try:
            website = Website.objects.get(slug=slug)
        except Website.DoesNotExist:
            return AppResponse.error(
                "Website not found.", None, http_error_code=status.HTTP_404_NOT_FOUND
            )

        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,
                }
            },
        ]
        result = Click.objects.mongo_aggregate(pipeline)
        print(result)
        return AppResponse.success("Daily visitor count found.")

requirements:

Django==3.0.5
djangorestframework==3.12.2
djongo==1.3.3
pymongo==3.11.2
Pritam Kadam
  • 3,203
  • 4
  • 19
  • 41

1 Answers1

1

Maybe you can share some more code and help out with providing what you already have.

A few things which can already be checked:

  1. Did you install al the requirements?
pip install -r requirements.txt [OR]
pip install Django==3.0.5 djangorestframework==3.12.2 djongo==1.3.3 pymongo==3.11.2
  1. Did you import the neccesary modules?
from djongo import DjongoManager

This may not include all necesarry imports. Check the documentation or post the code that you already have.

  1. Check the super part. It looks like the script doesn't know what to do with getattr. Maybe there is a typo in your super part or you didn't program it to handle it.
Sneil
  • 134
  • 2
  • 11