django 使用mongoengine 实现layui table的分页查询 (两种方案)

django 使用mongoengine 实现layui table的分页查询

由于目前django框架使用MongoDB 文献并不好找。
本人特意总结使用django 连接 MongoDB 使用的坑。
关于连接MongoDB 数据库使用何种第三方库,一开始是打算使用pymongo(因为之前使用过爬虫保存过数据),后查阅资料,发现django 使用的使用的是mongoengine 进行连接。

1.如何实现django连接mongodb

自行安装依赖库:

pip install mongoengine -i https://pypi.tuna.tsinghua.edu.cn/simple
2.setting.py 的配置

提供两种数据连接方案:mysql 和 mongodb
注意:可以同时使用两种数据库,并且不会发生冲突。

  • 1.连接数据方案:连接mysql 和 mongodb
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 数据库驱动
        'NAME': 'stu01',  # 数据库名
        'USER': 'root',  # 用户名
        'PASSWORD': 'root',  # 密码
        'HOST': '127.0.0.1',  # 数据库地址
        'PORT': '3306'  # 链接数据端口
    }
    ,
    'mongotest': {
        'ENGINE': None,  # 把默认的数据库连接至为None
    }

}
import mongoengine
# 连接mongodb中数据库名称为proxy_pool的数据库
conn = mongoengine.connect("proxy_pool")


  • 2.连接无数据密码MongoDB(默认情况下都不需要设密码)
DATABASES = {
    'default': {
        'ENGINE': None,
    }
}
from mongoengine import connect
connect('数据库名')
  • 3.连接设置了数据库密码
    无密码时把username ,和password 留空即可(password=’’)
DATABASES = {
    'default': {
        'ENGINE': None,
    }
}
import mongoengine
conn = mongoengine.connect(
    db="proxy_pool",  # 需要进行操作的数据库名称
    alias='default',  # 必须定义一个default数据库
    host="127.0.0.1",
    port=27017,
    username="root",#账号
    password="root",#密码
    authentication_source="admin", # 进行身份认证的数据库,通常这个数据库为admin“
)

view.py定以数据模型

from django.db import models


# 创建一个数据库user表模型
class User(models.Model):
    # 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列
    id = models.AutoField(primary_key=True)
    # 类里面的字段代表数据表中的字段(username),数据类型则由CharField(相当于varchar)
    username = models.CharField(max_length=100)
    # 密码
    password = models.CharField(max_length=100)
    # 获取密码
    # def getPassword(self):
    #     return self.password

'''
以下是mongodb使用数据模型

'''
import mongoengine
class SpiderModel(mongoengine.Document):
    name = mongoengine.StringField(max_length=21)  
    # max_length字段最大长度
    age= mongoengine.IntField(default=0)  
    # default设置默认值
    
    meta = {'collection': 'proxies'}  # 指明连接数据库的哪张表(/别名)

实现Veiw.py-> layui table数据分页 方案一:

常规请求方案

class IndexView(View):
    def get(self, request):
	    #实现是异步请求 方案
	    limit = int(request.GET.get("limit"))
	    page = int(request.GET.get("page"))
	    offset = (page - 1) * limit
	    
	    lists = SpiderModel.objects.skip(offset).limit(limit)
	    #skip 跳过 (page - 1) * limit 后的 limit(条数据)
	    #设 page = 3 
	    #   page = 3-1 = 2
	    #   limit = 2 * 10
	    #  则 offset =20 及 跳过 30行
	    counts = SpiderModel.objects().count()
	    # 总数
	    if lists:
	        json_list = []
	        for i in lists:
	            json_list.append(i._data)
	        data_j = json.dumps(json_list)
	        data_json = json.loads(data_j)
	        context = {"code": 0, "data": data_json, "count": counts, "msg": "0"}
	        return JsonResponse(context)
	

异步请求方案



def query_spider(request):
    #实现是异步请求 方案
    limit = int(request.GET.get("limit"))
    page = int(request.GET.get("page"))
    offset = (page - 1) * limit
    
    lists = SpiderModel.objects.skip(offset).limit(limit)
    #skip 跳过 (page - 1) * limit 后的 limit(条数据)
    #设 page = 3 
    #   page = 3-1 = 2
    #   limit = 2 * 10
    #  则 offset =20 及 跳过 30行
    counts = SpiderModel.objects().count()
    # 总数
    if lists:
        json_list = []
        for i in lists:
            json_list.append(i._data)
        data_j = json.dumps(json_list)
        data_json = json.loads(data_j)
        context = {"code": 0, "data": data_json, "count": counts, "msg": "0"}
        return JsonResponse(context)




实现 layui table数据分页 方案二 使用Paginator:

Paginator 及 django 内置分页类 -(规请求方案)

def query_spider(request):
    #实现是异步请求 方案
    limit = request.GET.get("limit")
    page = request.GET.get("page")
    
    lists = SpiderModel.objects
    
    paginator = Paginator(lists, limit)
    
    counts = SpiderModel.objects().count()
    p_list = paginator.page(page)
    
    if paginator:
    	#有时数据库响应缓慢,加以判断
        json_list = []
        for i in p_list:
            json_list.append(i._data)
        data_j = json.dumps(json_list)
        data_json = json.loads(data_j)
        context = {"code": 0, "data": data_json, "count": counts, "msg": "0"}
        return JsonResponse(context)


mysql 实现方案使用

# 页面查询用户信息
def query_users(request):
    key = request.GET.get("key")
    limit = request.GET.get("limit")
    page = request.GET.get("page")
    us = User.objects.all()
	# 在绝大多数sql 优化中 不应把所有数据查出,会极大消耗服务器性能
	# 不推荐使用该方案
    paginator = Paginator(us, limit)
    p_list = paginator.page(page).object_list
    count = paginator.count
    json_list = []
    for v in p_list:
        json_dict = model_to_dict(v)
        json_list.append(json_dict)
    data_j = json.dumps(json_list)
    data_json = json.loads(data_j)
    # 将数据发给页面
    context = {"code": 0, "data": data_json, "count": count, "msg": "数据"}
    return JsonResponse(context)

最后推荐使用
    lists = SpiderModel.objects.skip(offset).limit(limit)
优化数据库查询提升服务器稳定
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值