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操作已存在表的问题