Django通过Djongo读取MongoDB已有集合数据并前端展示方法
存量MongoDB集合读取实现方案
你之前用的是迁移生成新集合的流程,对于已经存在的city、languages集合,完全不用重新迁移,按下面的步骤配置就能直接读取数据:
1. 编写模型绑定已有集合
打开项目的models.py,给两个存量集合单独写模型类,核心是加两个Meta配置:
managed = False:告诉Django不要接管这个集合的创建、修改、删除操作,不会生成迁移脚本碰你已有的数据db_table:显式指定这个模型对应Mongo里的集合名,必须和库中实际集合名完全一致(注意Mongo集合名区分大小写)
模型里的字段和你实际集合里要用到的字段一一对应、类型匹配就行,不用把所有字段都列出来,没定义的字段不会读取也不会报错。
举个city集合的模型示例,你根据自己集合的实际字段调整就行:
from django.db import models class City(models.Model): # 按集合实际字段写,举几个常见字段例子 name = models.CharField(max_length=100, verbose_name="城市名") country_code = models.CharField(max_length=3, verbose_name="国家编码") population = models.IntegerField(verbose_name="人口") district = models.CharField(max_length=100, verbose_name="所属行政区") class Meta: managed = False db_table = 'city' # 对应库里的city集合
languages集合的模型写法完全一致,只需要把Meta里的db_table改成'languages',字段按集合实际结构定义即可。
2. 直接编写视图查询,不需要执行迁移
因为配置了managed=False,写完模型不用跑python manage.py migrate,直接和你之前查Destination的逻辑一样,在views.py里导入模型、查询数据传给模板就行:
from django.shortcuts import render from .models import Destination, City, Languages def index(request): dests = Destination.objects.all() # 直接查询存量集合数据,ORM用法和迁移生成的表完全一致 cities = City.objects.all()[:10] # 可以加切片、过滤等操作,比如取前10条 languages = Languages.objects.all() return render(request, 'index.html', { 'dests': dests, 'cities': cities, 'languages': languages })
3. 前端模板渲染
模板里的渲染逻辑和你之前写的完全一样,直接遍历查询集输出字段即可,比如渲染城市列表:
<div class="city-list"> <h3>城市列表</h3> {% for city in cities %} <div class="city-item"> <p>城市名:{{ city.name }}</p> <p>所属行政区:{{ city.district }}</p> <p>人口:{{ city.population }}</p> </div> {% endfor %} </div>
备选方案:直接用Pymongo原生查询
如果你的集合结构不固定、字段太多不想挨个定义模型,可以跳过ORM层,直接用Pymongo连库查询,不用写模型,更灵活:
from django.shortcuts import render from pymongo import MongoClient from .models import Destination def index(request): dests = Destination.objects.all() # 直连Mongo实例,有账号密码的话把认证信息加到连接串里 client = MongoClient("mongodb://localhost:27017/") world_db = client["world"] # 直接操作集合查询,查出来的是字典列表 cities = list(world_db["city"].find().limit(10)) languages = list(world_db["languages"].find()) client.close() return render(request, 'index.html', { 'dests': dests, 'cities': cities, 'languages': languages })
这种方式查出来的数据在模板里也是通过键名取值,和ORM查出来的结果使用体验差别不大,适合结构灵活的集合场景。
注意:如果用ORM方式查询时报错提示找不到集合,先去Mongo里核对集合名的大小写、拼写,Djongo不会自动给集合名加前缀,写的是什么名就找什么名的集合。
内容的提问来源于stack exchange,提问作者def init
相关产品推荐
相关产品推荐

