django对接mongodb实现数据库查询操作_Q893448322的博客-程序员秘密

技术标签: python  css  django  html  javascript  

最近再给客户做一个数据展示的后台操作界面,给的数据是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. 运行查看结果:

在这里插入图片描述
毕设没思路看这里https://blog.csdn.net/Q893448322/article/details/107642349?spm=1001.2014.3001.5501

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Q893448322/article/details/107847974

智能推荐

select count(0) from 和 select count(*) from 的区别_热带鱼2020的博客-程序员资料

select count(*) :查询总行数,并且会对表的每个字段进行扫描select count(0) :忽略所有列,只进行全表总行数

100天精通Python(基础篇)——第1天:Python和Vscode环境安装_无 羡ღ的博客-程序员资料

Python安装官网:http://www.python.org/download/安装成功后,打开命令提示符窗口(win+R,在输入cmd回车),敲入python后pip升级命令:python -m pip install --upgrade pippip install name //这里的name是要安装的第三方库名pip install name -i http://mirrors.aliyun.com/pypi/simple/ 国内镜像源阿里云:http://mirror

脑与认知科学3 脑神经影像下_一个不愿透露姓名的孩子的博客-程序员资料

脑与认知科学3 脑神经影像下Diffusion MRIfunctional MRItask-fMRIrs-fMRI这一讲继续介绍脑神经影像的常用方法。上一讲提到了MRI,这一讲介绍MRI更细致的一些应用。Diffusion MRIDiffusion MRI同样是利用MRI的机器,但在扫描的时候我们要试图扫描水分子的运动。因为自由的水分子与位于神经元中的水分子运动行为会有很大差别,自由水分子在三维空间中几乎是处于自由扩散(free diffusion)状态的;而神经纤维中的水分子只能按纤维的走向扩散。

Anglular8的@ViewChild的变化_春风又一季的博客-程序员资料

配置ViewChild / ContentChild查询的时间使用此功能时,必须提供静态标志以定义何时需要解析ViewChild和ContentChild实例。使用此功能时,必须提供静态标志以定义何时需要解析ViewChild和ContentChild实例。// Ensure Change Detection runs before accessing the [email protected]

思杰服务器需要显卡性能,【长期更新】Citrix日常问题支持以及各类KB大全_闫沐喜的博客-程序员资料

本文章页面收集的是关于Citrix一些常见问题KB以及一些问题处理的连接!2020年06月16更新产品生命周期Citrix软件技术支持服务周期,参考以下链接的内容:https://hfly.cc/70XH0v最近软件更新服务器虚拟化平台Citrix 服务器虚拟化硬件兼容性列表兼容性列表地址:https://hfly.cc/JezfACitrix 服务器虚拟化驱动版本 Citrix Hypervi...

Push failed fatal: unable to access ‘https://github.The requested URL returned error: 403_sunrj_go的博客-程序员资料

**Push failed fatal: unable to access 'https://github.The requested URL returned error: 403**Github 禁用了TLS v1.0 and v1.1,必须更新Windows的git凭证管理器,才行。https://github.com/Microsoft/Git-Credential-Manager-for-Windows/releases/tag/v1.14.0点击下载安装 GCMW-1.14.0.exe

随便推点

在string.xml中字符串末尾添加空格失败_mypotatolove的博客-程序员资料

http://www.tuicool.com/articles/riYzimEThis doesnt work with wrap_content of a textview, when the space occurs at the end of the text. The textview does not maintain the width that is taken

vue 2.0与vue 3.0中的本地文件下载_王王王晓晓蓉的博客-程序员资料_vue2.0js文件下载

需求:获取静态资源文件export.pdf,将pdf文档下载至本地方案:利用axios请求,get请求用blob流的方式下载项目1:vue 2.0 + element ui+es5中利用a标签,给个点击事件download()&lt;a id="attname" class="attname" href="javascript:void(0);" @click="download"&gt;帮助文档&lt;/a&gt;页面已经引用过axios,使用如下:import axios from 'ax

Gmail对比Outlook哪个更好_China_Ajax的博客-程序员资料_hotmail

随着 Slack、WhatsApp&nbsp;和&nbsp;Skype&nbsp;等实时通信应用程序的普及,您可能会惊讶地发现电子邮件仍然是工作中的主要通信工具 - 并且在全球拥有 39 亿用户,这种情况不太可能随时改变很快。主导该领域的是&nbsp;Gmail&nbsp;和&nbsp;Outlook——这两个世界上最受欢迎的电子邮件提供商。尽管两者之间有很多相似之处,但 Microsoft&nbsp;Outlook&nbsp;更像是一个电子邮件客户端,而&nbsp;Gmail&nbsp;本质上是网络邮

@Value获取不到值_zzy_阳阳的博客-程序员资料

@Value有两种获取application.properties值得方法: 一、PlaceHolder方式:格式${...}@Componentpublic class GetValue { @Value("${book.name}") private String name; public String getName() { return name

恢复报错ora-01180_kuaile_yuanzi的博客-程序员资料_ora-01180

https://blog.csdn.net/weixin_34029949/article/details/85997154最近在验证、测试备份有效性时,遇到了“ORA-01180: can not create datafile 1”这个错误,顺便结合metalink的官方文档“RMAN restore fails with ORA-01180: can not create datafile...

知名互联网公司校招中常见的算法题_dengya2093的博客-程序员资料

本次Chat,主要从知名互联网公司在面试中喜欢提问的算法入手,给大家详细阐述讲解面试中的高频率算法题。涉及到的算法题主要包括:排序和查找、链表、二叉树、队列、堆栈、字符串以及数组等方面。如果你想在来年的校园招聘中拿下一线互联网的Offer,那么本次Chat将助你玩转算法面试~面试,是大家从学校走向社会的第一步。大型互联网公司的校园招聘,从形式上说,面试一般分为2-3轮技术面试+1轮H...

推荐文章

热门文章

相关标签