您的位置:首页 > 数据库 > Mongodb

django对接mongodb实现数据库查询操作

2020-08-06 19:34 801 查看

最近再给客户做一个数据展示的后台操作界面,给的数据是mongo的,要知道django对mongo不是很友好,网上有说views层操作mongo数据库和操作mysql大体差不多,但是例如mysql的查询语句是下面这样查询所有的:

all = models.send.objects.all().values('party_id','party_name','party_img')

很遗憾,mongo可是做不到,他没有all(),没有value(),所以用操作mysql的方法来操作mongo是不切实际的。

补充一句,django对接mongo是不需要执行迁移的,但是model层建表还是要有的,当连接好数据库执行程序后(通过浏览器执行配置好的url),会根据models建的模生成数据库;但是如果想拿到客户给的mongo数据,model层的表名(即类名)要和拿到的collection(类似于mysql的表)的名称一致,而models层的字段名要和collection内部的key值一致(因为mongo不同于mysql,其collection数据形式是key:value的形式)

整体流程如下:

  1. 主要目录展示:

  1. 展示models的建模

    from mongoengine import *
    
    #mongo的模板是要继承mongoengine下Document的,而不是mysql里面的Models
    class article(Document):
    # 定义数据库中的所有字段,及拿到的客户表key值
    two_level_site = StringField(max_length=32)
    three_level_site = StringField(max_length=32)
    four_level_site = StringField(max_length=32)
    subject = StringField(max_length=32)
    department = StringField(max_length=32)
    article_title = StringField()
    article_link = StringField()
    article_type = StringField()
    article_post_date = DateTimeField()
    insert_time = DateTimeField()
    article_stream = StringField()
    article_content = StringField()
    
    # 指明连接的数据表名
    meta = {'collection':'article'}
  2. views层

    # 取值
    def neirongView(request):
    if request.method == 'GET':
    #article是表名,这一步是拿到article的QuerySet
    find_neirong = article.objects
    #既然没有mysql的查询方法,那么就自建一个列表,用于存储取到的数据
    context = []
    # 将列表设置为全局变量
    global context
    # QuerySet是需要遍历才能取到值的
    for f in find_neirong:
    #拿到数据库的id,注意models里面并没有设置id字段,这样拿到的是mongo自动生成的objectid
    id = f.id
    #通过“对象+.”的方法拿到数据库指定key值下面的内容
    #注意其中two_title是可以任意命名的,而two_level_site必须要和数据库的key一致
    two_title = f.two_level_site
    three_title = f.three_level_site
    four_title = f.four_level_site
    lanmu = f.subject
    bushi = f.department
    title = f.article_title
    t_url = f.article_link
    t_sjlx = f.article_type
    date1 = f.article_post_date
    date2 = f.insert_time
    a_stream = f.article_stream
    
    # 遍历取完的值要放到一个暂时的字典中,改字典的目的是将取到的值封装成key、value的形式
    #只有这样才能在界面上根据key取到其对应数据库的value值,单引号内部明明可以随意,但是后面的value是必须要和上面写的字段一致,为了更容易理解,建议我这样写
    context1 = {'id':id,'two_title': two_title, 'three_title': 	three_title, 'four_title': four_title, 'lanmu': lanmu,
    'bushi': bushi, 'title': title, 't_url': t_url, 't_sjlx': t_sjlx, 'date1': date1, 'date2': date2,'a_stream':a_stream
    
    }
    # context1的值会一直别覆盖(字典不允许有重复的key),所以每次遍历赋值后都要append一开始创建的context列表中
    #最终context的形式为[{key:value}{key1}{value1}...{}]
    context.append(context1)
    
    # 最终就可以通过render渲染context到html界面取值了
    return render(request,'content.html',{'context':context})
  3. 配置url

    #主url
    from django.urls import path,include
    from apps.index import views
    # from apps.neirong import views
    
    urlpatterns = [
    path('neirong/',include('apps.neirong.urls')),
    ]
    #app的url
    from django.contrib import admin
    from django.urls import path,include
    from apps.neirong import views
    
    urlpatterns = [
    path('',views.neirongView),
    ]
  4. 界面取值

    {% for i in context %}
    <tr>
    <td >{{ i.id }}</td>
    <td>{{ i.two_title }}</td>
    <td>{{ i.three_title }})</td>
    <td>{{ i.four_title }}</td>
    <td>{{ i.lanmu }}</td>
    <td>{{ i.bushi }}</td>
    <td >{{ i.title }}</td>
    <td scope="row">
    {{ i.t_url }}
    </td>
    <td>{{ i.t_sjlx }}</td>
    <td>{{ i.a_stream }}</td>
    <td>{{ i.date1 }}</td>
    {#        <td>2015/08/08</td>#}
    <td>{{ i.date2 }}</td>
    
    <td>
    <div role="presentation" class="dropdown">
    <button class="btn btn-default dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
    操作<span class="caret"></span>
    </button>
    <ul class="dropdown-menu">
    <li><a href="#">编辑</a></li>
    <li><a href="#">删除</a></li>
    <li><a href="#">全局置顶</a></li>
    </ul>
    </div>
    </td>
    </tr>
    {% endfor %}
  5. 运行查看结果:


如果对您有帮助,赏口饭吃❤谢谢老板❤

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐