【问题标题】:Error "count() takes exactly 2 arguments (1 given)" in pagination function with django使用 django 的分页函数中出现错误“count() 恰好需要 2 个参数(给定 1 个)”
【发布时间】:2019-02-22 16:08:19
【问题描述】:

尽管我已成功从数据库中获取数据并创建了分页器,但我发现自己在返回数据时遇到困难,最终以 json 格式显示数据。

我发现这篇文章 https://simpleisbetterthancomplex.com/tutorial/2016/08/03/how-to-paginate-with-django.html 很有用(尽管在我的情况下,我使用基于类的方法,因为我希望将服务器端处理我的数据表作为最终目标。)

我的网址:

url(r'^warehouse_tabledata/(?P<page>\d+)/$',views.ProductSerialNumbersListJSon.as_view(), name='warehouse_list_json'),

我的看法:

class ProductSerialNumbersListJSon(LoginRequiredMixin,BaseDatatableView):
# my model
model = ProductSerialNumbers
columns = ['snumber' , 'order','product','registration_date']
order_columns = ['snumber','order','product','registration_date']
max_display_length = 100

def get_initial_queryset(self):
    #fetch the query list from db
    query_list=ProductSerialNumbers.objects.filter(Q(snumber__isnull=True)|Q(order_id__isnull=True)|Q (order_id__finished=0)).order_by("id")
    paginator = Paginator(query_list,13) #13 items per page
    page=int(self.kwargs['page'])

    try:
        result = paginator.page(page)
    except PageNotAnInteger:
        result = paginator.page(1)
    except EmptyPage:
        result = paginator.page(paginator.num_pages)
    product_serials = result.object_list.all().values_list('id', flat=True)
    return ProductSerialNumbers.objects.filter(pk__in=product_serials)

我的回溯:

    NotSupportedError at /warehouse_tabledata/2/
(1235, "This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'")
Request Method: GET
Request URL:    http://73.neurosynthesis.com:9001/warehouse_tabledata/2/
Django Version: 1.11.16
Exception Type: NotSupportedError
Exception Value:    
(1235, "This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'")
Exception Location: /usr/local/lib/python2.7/dist-packages/django_datatables_view/base_datatable_view.py in handle_exception, line 265
Python Executable:  /usr/bin/python
Python Version: 2.7.12
Python Path:    
['/var/www/vhosts/intranet.health-nutrition.gr/farmakeio',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages']
Server time:    Fri, 22 Feb 2019 10:02:22 +0200
Traceback Switch to copy-and-paste view
/usr/local/lib/python2.7/dist-packages/django/core/handlers/exception.py in inner
            response = get_response(request) ...
▶ Local vars
/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py in _get_response
                response = self.process_exception_by_middleware(e, request) ...
▶ Local vars
/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py in _get_response
                response = wrapped_callback(request, *callback_args, **callback_kwargs) ...
▶ Local vars
/usr/local/lib/python2.7/dist-packages/django/views/generic/base.py in view
            return self.dispatch(request, *args, **kwargs) ...
▶ Local vars
/usr/local/lib/python2.7/dist-packages/django/contrib/auth/mixins.py in dispatch
        return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs) ...
▶ Local vars
/usr/local/lib/python2.7/dist-packages/django/views/generic/base.py in dispatch
        return handler(request, *args, **kwargs) ...
▶ Local vars
/usr/local/lib/python2.7/dist-packages/django_datatables_view/mixins.py in get
            func_val = self.get_context_data(**kwargs) ...
▶ Local vars
/usr/local/lib/python2.7/dist-packages/django_datatables_view/base_datatable_view.py in get_context_data
            return self.handle_exception(e) ...
▶ Local vars
/usr/local/lib/python2.7/dist-packages/django_datatables_view/base_datatable_view.py in handle_exception
        raise e ...
▶ Local vars

【问题讨论】:

  • 向我们展示完整的堆栈跟踪,不清楚发生在哪一行。

标签: django pagination django-pagination


【解决方案1】:

这里paginator.page(..) 返回django.core.paginator.Page 的一个实例。但是您需要返回ProductSerialNumbers 的查询集。你可以这样做:

def get_initial_queryset(self):
    query_list=ProductSerialNumbers.objects.filter(Q(snumber__isnull=True)|Q(order_id__isnull=True)|Q (order_id__finished=0)).order_by("id")
    paginator = Paginator(query_list,13) #13 items per page
    page=int(self.kwargs['page'])

    try:
        page_obj = paginator.page(page)
    except PageNotAnInteger:
        page_obj = paginator.page(1)
    except EmptyPage:
        page_obj = paginator.page(paginator.num_pages)

    product_serials = page_obj.object_list.all().values_list('pk', flat=True)
    return ProductSerialNumbers.objects.filter(pk__in=list(product_serials))

【讨论】:

  • 这个解决方案给出了“一旦切片被获取就无法过滤查询”,所以它对我不起作用。我的问题是我无法根据我所做的查询和我声明的分页器加载 json。
  • @gtopal 更新了我的答案。请看一看。
  • 我更改了我的代码,现在它在 /warehouse_tabledata/2/ 处给出了错误 NotSupportedError (1235, "此版本的 MySQL 尚不支持 'LIMIT & IN/ALL/ANY/SOME 子查询' ")
  • 您能否将您的堆栈跟踪添加到您的问题中?我也更新了我的答案。希望它可以帮助@gtopal
  • @ruddra 为什么会产生子查询?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多