为什么对 Django 驱动的应用程序使用 Ajax 和 Json 的 CRUD 操作如此缓慢?如果 7000 条记录是一个问题,我如何将它改进到秒?

Why CRUD Operations Using Ajax and Json for Django powered app is so slow?If being 7000 records is an issue, how can I improve it to seconds?

我正在对大约有 7000 个 records.Currently 的远程遗留 MySQL 数据库执行操作,更新/删除/创建大约需要 1.5 分钟 operation.I 还导入了必要的文件不包含在下面的 Views.py 中。

使用 dict() 有问题吗?我应该使用 Rest 吗?或者其他一些 API。任何建议将不胜感激!

代码如下:

plugin.js

$(document).ready(function(){
var ShowForm = function(){
    var btn = $(this);
    $.ajax({
        url: btn.attr("data-url"),
        type: 'get',
        dataType:'json',
        beforeSend: function(){
            $('#modal-book').modal('show');
        },
        success: function(data){
            $('#modal-book .modal-content').html(data.html_form);
        }
    });
};

var SaveForm =  function(){
    var form = $(this);
    $.ajax({
        url: form.attr('data-url'),
        data: form.serialize(),
        type: form.attr('method'),
        dataType: 'json',
        success: function(data){
            if(data.form_is_valid){
                $('#book-table tbody').html(data.book_list);
                $('#modal-book').modal('hide');
            } else {
                $('#modal-book .modal-content').html(data.html_form)
            }
        }
    })

    return false;
}

// create 

$(".show-form").click(ShowForm);
$("#modal-book").on("submit",".create-form",SaveForm);

//update

$('#book-table').on("click",".show-form-update",ShowForm);
$('#modal-book').on("submit",".update-form",SaveForm)

//delete

$('#book-table').on("click",".show-form-delete",ShowForm);
$('#modal-book').on("submit",".delete-form",SaveForm)

});

Views.py

 # Fetching records with pagination

 @login_required()
 def book_list(request):
 books = AvailstaticCopy.objects.all().order_by('-row_date')
 page = request.GET.get('page', 1)

 paginator = Paginator(books, 144)
 try:
    books = paginator.page(page)
 except PageNotAnInteger:
    books = paginator.page(1)
 except EmptyPage:
    books = paginator.page(paginator.num_pages)

 context = {
 'books': books
 }
 return render(request, 'books/book_list.html',context)

@login_required()
def save_all(request,form,template_name):

data = dict()
if request.method == 'POST':
    if form.is_valid():
        form.save()
        data['form_is_valid'] = True
        books = AvailstaticCopy.objects.all()
        data['book_list'] = render_to_string('books/book_list_2.html',
        {'books':books})
    else:
        data['form_is_valid'] = False
  context = {
  'form':form
 }
 data['html_form'] = render_to_string(template_name,context,request=request)
 return JsonResponse(data)

# Create new record

@login_required()
def book_create(request):
if request.method == 'POST':
    form = AvailForm(request.POST)
else:
    form = AvailForm()
return save_all(request,form,'books/book_create.html')

# Update record

@login_required()
def book_update(request,id):
 book = get_object_or_404(AvailstaticCopy,id=id)
 if request.method == 'POST':
    form = AvailForm(request.POST,instance=book)
 else:
    form = AvailForm(instance=book)
return save_all(request,form,'books/book_update.html')

 # Delete Record

@login_required()
def book_delete(request,id):
 data = dict()
 book = get_object_or_404(AvailstaticCopy,id=id)
 if request.method == "POST":
    book.delete()
    data['form_is_valid'] = True
    books = AvailstaticCopy.objects.all()
    data['book_list'] = render_to_string('books/book_list_2.html',
    {'books':books})
 else:
    context = {'book':book}
    data['html_form'] = 
 render_to_string('books/book_delete.html',context,request=request)

 return JsonResponse(data)

我想,您的问题出在服务器响应上。在您更改服务器数据(删除、更新、创建)的所有视图中,您尝试 return 更新图书列表,但您不对图书查询集进行分页,并且 django 模板处理器需要花费大量时间来准备 html与所有书籍。我建议你添加像这样对查询集进行分页的函数:

def get_book_page(request, books):
    page = request.GET.get('page', 1)
    paginator = Paginator(books, 144)
     try:
        books = paginator.page(page)
     except PageNotAnInteger:
        books = paginator.page(1)
     except EmptyPage:
        books = paginator.page(paginator.num_pages)
    return books

并将所有书籍查询集包装在您的视图中。还需要将它添加到 urls 页码作为 get 参数(例如 /update-book/1?page=2),因为如果你不这样做,它将无法工作。

感谢您给我 hint.That 成功!我有这样的分页查询集:

def save_all(request,form,template_name):

  data = dict()
  paginate_by = 144

  if request.method == 'POST':
    if form.is_valid():
        form.save()
        data['form_is_valid'] = True
        books = AvailstaticCopy.objects.all().order_by('-row_date')
        page = request.GET.get('page', 1)
        paginator = Paginator(books, 144)
        try:
            books = paginator.page(page)
        except PageNotAnInteger:
            books = paginator.page(1)
        except EmptyPage:
            books = paginator.page(paginator.num_pages)
        data['book_list'] = render_to_string('books/book_list_2.html',
        {'books':books})

    else:

        data['form_is_valid'] = False
 context = {
 'form':form
 }
 data['html_form'] = render_to_string(template_name,context,request=request)
 return JsonResponse(data)