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 映射器问题的主要内容,如果未能解决你的问题,请参考以下文章