django操作非ORM创建的表

django--ORM连接已存在的表

问题:

django的ORM怎么连接已存在的表,然后进行增删查改操作?

工作中会遇见很多二次开发的时候,表都是已经创建好的,用django的ORM进行二次开发,怎么操作数据库中的表呢?

下面介绍一种完美解决方案:

现有一张表,表名为tencent_depth,表结构如下:

mysql> desc tencent_depth;
+------------------+--------------+------+-----+---------+----------------+
| Field            | Type         | Null | Key | Default | Extra          |
+------------------+--------------+------+-----+---------+----------------+
| id               | int(11)      | NO   | PRI | NULL    | auto_increment |
| Positionname     | varchar(100) | NO   |     | NULL    |                |
| Workingplace     | char(20)     | YES  |     | NULL    |                |
| Positioncategory | char(20)     | YES  |     | NULL    |                |
| Peoplenumber     | char(10)     | YES  |     | NULL    |                |
| Operatingduty    | text         | YES  |     | NULL    |                |
| Jobrequirements  | text         | YES  |     | NULL    |                |
+------------------+--------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

表里面有很多数据,用scrapy爬取的腾讯招聘信息,一共3827条记录

关于scrapy爬虫是怎么爬取数据的,这里先不介绍,以后会写相关的文档,

现有一张3827条数据的表,怎么通过django的ORM操作(增删改查),让数据可视化?(这里只写models.py相关配置)

第一次尝试:

根据tencent_depth的表结构,使用ORM连接的时候需要根据tencent_depth的表写表结构,需要一一对应

修改models.py文件:

class tencent_depth(models.Model):
    id = models.AutoField(primary_key=True)              # 设置id为主键,自增
    Positionname = models.CharField(max_length=80)       # 设置Positionname为char类型,指定长度为80
    Workingplace = models.CharField(max_length=20)       # 设置Workingplace为char类型,指定长度为20
    Positioncategory = models.CharField(max_length=20)   # 设置Positioncategory为char类型,指定长度为20
    Peoplenumber = models.CharField(max_length=10)       # 设置Peoplenumber为char类型,指定长度为10
    Operatingduty = models.TextField(max_length=1000)    # 设置Operatingduty为text类型,指定长度为1000
    Jobrequirements = models.TextField(max_length=1000)  # 设置Jobrequirements为text类型,指定长度为1000

先执行

python manage.py makemigrations

执行makemigrations 建立 migrations目录,并记录下你所有的关于modes.py的改动,比如0001_initial.py, 但是这个改动还没有作用到数据库文件

再执行

python manager.py migrate

将该改动作用到数据库文件

访问页面:  (报错)

会报错找不到app_tencent_depth这个表,而我的表名为tencent_depth

django的ORM连接表的时候,会自动在前面加上应用名(app_),就是创建应用时起的名字

第二次尝试:

既然它说找不到app_tencent_depth这个表,那就直接把tencent_depth这个表的名字改为app_tencent_depth

在mysql里面执行:

mysql> use scrapyDB;
Database changed
mysql> alter table tencent_depth rename app_tencent_depth;
Query OK, 0 rows affected (0.01 sec)

修改models.py文件

class tencent_depth(models.Model):
    id = models.AutoField(primary_key=True)              # 设置id为主键,自增
    Positionname = models.CharField(max_length=80)       # 设置Positionname为char类型,指定长度为80
    Workingplace = models.CharField(max_length=20)       # 设置Workingplace为char类型,指定长度为20
    Positioncategory = models.CharField(max_length=20)   # 设置Positioncategory为char类型,指定长度为20
    Peoplenumber = models.CharField(max_length=10)       # 设置Peoplenumber为char类型,指定长度为10
    Operatingduty = models.TextField(max_length=1000)    # 设置Operatingduty为text类型,指定长度为1000
    Jobrequirements = models.TextField(max_length=1000)  # 设置Jobrequirements为text类型,指定长度为1000

删除migrations目录下生成的文件

然后执行

python manage.py makemigrations

python manager.py migrate

再次访问页面,可以获取数据了, 别急没完, 下面还有终极解决方案

虽然可以用django的ORM连接表了,但是却改了表名  (线上环境中,表和表之间肯定有很多关联的), 不能这么做

完美解决方案:

既然不能改tencent_depth表的名字,那么让django的orm连接表的时候,指定表名不就行了吗

这里先把之前改掉的表名,改回来先

mysql> use scrapyDB;
Database changed
mysql> alter table app_tencent_depth rename tencent_depth;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+----------------------------+
| Tables_in_scrapyDB         |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| tencent_depth              |
| tencent_recruit            |
+----------------------------+
12 rows in set (0.00 sec)

这里表名已经改回来了 里面有个表为 tencent_depth

修改models.py文件

class tencent_depth(models.Model):
    id = models.AutoField(primary_key=True)
    Positionname = models.CharField(max_length=100)
    Workingplace = models.CharField(max_length=20)
    Positioncategory = models.CharField(max_length=20)
    Peoplenumber = models.CharField(max_length=10)
    Operatingduty = models.TextField(max_length=1000)
    Jobrequirements = models.TextField(max_length=1000)

    class Meta:  # 必须要写这个类
        db_table = 'tencent_depth'  # 指定表名

删除migrations目录下生成的文件

然后执行这个命令就行

python manage.py makemigrations 

访问页面:

查询成功

添加一个字段,插入一条记录,并获取值显示出来(主要看看增删改查有问题没)

修改models.py文件

from django.db import models

class tencent_depth(models.Model):
    id = models.AutoField(primary_key=True)
    Positionname = models.CharField(max_length=100)
    Workingplace = models.CharField(max_length=20)
    Positioncategory = models.CharField(max_length=20)
    Peoplenumber = models.CharField(max_length=10)
    Operatingduty = models.TextField(max_length=1000)
    Jobrequirements = models.TextField(max_length=1000)

    # 添加一个时间字段
    create_time = models.DateTimeField(null=True)

    class Meta:
        db_table = 'tencent_depth'

修改view.py视图函数

from django.shortcuts import render,HttpResponse,redirect

# Create your views here.
from app import models
import datetime

def index(request):
    data = datetime.datetime.now()
    data = data.strftime("%Y-%m-%d %H:%I:%S")  # 获取本地格式化时间
    
    # 添加一条测试记录
    ret = models.tencent_depth.objects.create(Positionname='本地测试(运维开发)',
                                        Workingplace='本地测试(上海)',
                                        Positioncategory='本地测试(技术)',
                                        Peoplenumber='本地测试(1人)',
                                        Operatingduty='本地测试(无)',
                                        Jobrequirements='本地测试(无)',
                                        create_time=data,
                                        )
    return render(request, 'index.html', {'ret': ret})

修改templates里面的index.html

{% extends 'base.html' %}

{% block content %}
    <div class="jumbotron">

        <p>{{ ret.Positionname }}</p>
        <p>{{ ret.Workingplace }}</p>
        <p>{{ ret.Positioncategory }}</p>
        <p>{{ ret.Operatingduty }}</p>
        <p>{{ ret.Jobrequirements }}</p>
        <p>{{ ret.create_time}}</p>  # 这里传过来的时间已经是格式化时间,所以不需要用date过滤器了
        <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
    </div>
{% endblock %}

{{% block title %}
<title>Index</title>
{% endblock %}}

然后执行

python manage.py makemigrations

python manager.py migrate

访问页面:

添加字段,添加记录,获取数据都没有问题,完美解决django的ORM操作已存在表的问题

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构师历程

mysql 谈谈innodb存储引擎

5.7版本引入了模式自动转换的功能,但该语法依然保留了。 另外一个有趣的点是,在5.7版本中,你可以通过设置session_track_transactio...

45520
来自专栏杨建荣的学习笔记

一条关于swap争用的报警邮件分析(一)(r7笔记第28天)

最近这些天有一台服务器总是会收到剩余swap过低的告警。 邮件内容大体如下: ############ ZABBIX-监控系统: --------------...

38740
来自专栏GreenLeaves

oracle 表空间tablespace

一、Oracle 表空间的组成 Everoone knows Oracle数据库真正存放数据的是数据文件,Oracle表空间是逻辑上的概念,他在物理上是并不存在...

36880
来自专栏代码世界

MYSQL之视图、触发器、存储过程、函数、事物、数据库锁和数据库备份

一、视图 -- view 视图:是一个虚报表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。 视图有如下特点:   1.视图的列可以来自...

40590
来自专栏bboysoul

磁盘分析工具Ncdu的简单使用和体验

因为我使用的是120g的固态硬盘,所以我的本地就不能存很多东西,经常要删除很多东西,所以看每个目录的大小就很重要,下面推荐一个磁盘分析工具Ncdu,这个工具是用...

8010
来自专栏北京马哥教育

初识mysql:基本原理和使用

一、 数据库的出现 1. 数据库是什么: 数据库简单来说,就是存储数据的地方(废话),对于用户认证这个过程来说,当用户登录服务器时, 系统需要把用户的输入的...

43650
来自专栏抠抠空间

MySQL 之 视图、触发器、存储过程、函数、事物与数据库锁

浏览目录: 1.视图 2.触发器 3.存储过程 4.函数 5.事物 6.数据库锁 7.数据库备份 1.视图 视图:是一个虚拟表,其内容由查询定义。同真实的表...

45070
来自专栏乐沙弥的世界

RMAN 数据库克隆文件位置转换方法

      在使用RMAN克隆数据库时,如果辅助数据库(新数据库)使用了与目标数据库(原数据库)使用了不同的路径,那么就存在位置转换的问题。在Oracle中,控...

8310
来自专栏Porschev[钟慰]的专栏

Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

前言   前面一有写到一篇Node.js+Express构建网站简单示例https://cloud.tencent.com/developer/article/...

2.3K90
来自专栏杨建荣的学习笔记

dataguard备库的数据文件的迁移实战(r8笔记第24天)

在前几天也花了一点时间测试了一下关于备库数据文件的迁移,这部分的工作看起来还是比较常规的,当然方法也很多。但是在实际工作中就更不能掉以轻心,所有 的操作都要有理...

361110

扫码关注云+社区

领取腾讯云代金券