django - AttributeError:“产品”对象没有属性“过滤器”
问题描述
我正在尝试访问链接“ http://127.0.0.1:8000/products/2 ”,其中我正在使用通用视图(DetailsView),并且在该视图中我想使用我的自定义模型管理器。但是我收到错误消息,指出 AttributeError:“产品”对象没有属性“过滤器”。
我正在使用 python version3.8 和 django version 2.2.6
# ModelManager
#-----------------------------------------------
class ProductManager(models.Manager):
def get_by_id(self,id):
qs = self.get_queryset().filter(id=id)
if qs.count() == 1:
return qs.first()
return None
# View
#-----------------------------------------------
class ProductDetailView(DetailView):
# queryset = Product.objects.all( )
def get_queryset(self, *args, **kwargs):
request = self.request
pk = self.kwargs.get("pk")
instance = Product.objects.get_by_id(pk)
if instance is None:
raise Http404("Product Couldn't be found")
return instance
# 错误
Internal Server Error: /products/2
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/django/views/generic/base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/django/views/generic/base.py", line 97, in dispatch
return handler(request, *args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/django/views/generic/detail.py", line 106, in get
self.object = self.get_object()
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/django/views/generic/detail.py", line 36, in get_object
queryset = queryset.filter(pk=pk)
AttributeError: 'Product' object has no attribute 'filter'
[22/Oct/2019 18:51:56] "GET /products/2 HTTP/1.1" 500 75133
解决方案
[ get_queryset(..)
Django-doc]需要一个queryset,而不是一个实例。您应该改写get_object(..)
[Django-doc]:
class ProductDetailView(DetailView):
def get_object(self, *args, **kwargs):
request = self.request
pk = self.kwargs.get('pk')
instance = Product.objects.get_by_id(pk)
if instance is None:
raise Http404('Product Couldn't be found')
return instance
覆盖get_queryset
失败的原因是因为如果您返回单个Product
对象,则默认值get_object
将调用get_queryset
,然后调用.filter(..)
该结果。但是单身Product
当然没有.filter(..)
办法。
请注意,将您的经理实施为:
class ProductManager(models.Manager):
def get_by_id(self,id):
try:
return self.get_queryset().get(id=id)
except (self.model.DoesNotExist, self.model.MultipleObjectsReturned):
return None
因为这里我们只会对数据库进行一次查询,而不是多次查询。
推荐阅读
- ios - 设置永久数组元素
- algorithm - 创建矢量的排序副本的更快方法
- python - 如何在 Python 中动态地将命名参数格式化为字符串?
- android - IllegalArgumentException:没有这样的服务 ComponentInfo{JobIntentService}
- c++ - 是函数参数c ++中允许的简写符号
- java - 如何在 mule 流的入站路径中创建变量?
- angularjs - PhpStorm 抱怨找不到类型,但仍然可以打开定义它的文件
- onedrive - 使用一个驱动器一键列出文件和文件夹
- php - 按外键mysql同一张表排序
- c - 指针变量的地址是如何分配的?他们遵循任何模式吗?