You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:18:42