mongo_aggregate() 的 Djongo 映射器问题

Posted

技术标签:

【中文标题】mongo_aggregate() 的 Djongo 映射器问题【英文标题】:Djongo mapper issue with mongo_aggregate() 【发布时间】:2021-05-04 20:00:20 【问题描述】:

mongo_aggregate() 面临问题。下面是堆栈跟踪。

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.")

要求:

Django==3.0.5
djangorestframework==3.12.2
djongo==1.3.3
pymongo==3.11.2

【问题讨论】:

请分享你所做的代码 请也分享堆栈跟踪。 @Chandan 添加了堆栈跟踪 【参考方案1】:

也许您可以分享更多代码并帮助提供您已经拥有的东西。

一些已经可以检查的事情:

    您是否安装了所有要求?
pip install -r requirements.txt [OR]
pip install Django==3.0.5 djangorestframework==3.12.2 djongo==1.3.3 pymongo==3.11.2
    您是否导入了必要的模块?
from djongo import DjongoManager

这可能不包括所有必要的进口。检查文档或发布您已有的代码。

    检查超级部分。看起来脚本不知道如何处理 getattr。也许你的 super 部分有错字,或者你没有对其进行编程来处理它。

【讨论】:

我已通过添加更多实现来更新问题。 你能添加你的fields.py吗?它显示有错误

以上是关于mongo_aggregate() 的 Djongo 映射器问题的主要内容,如果未能解决你的问题,请参考以下文章

既是3的倍数又是5的倍数都有哪些

一个三位数既是3的倍数,又是5的倍数。这样的三位数最小是啥

数组的创建,及数组的方法

cnn中的步长的目的和重要性是啥

物质的运动

多态的好处??