发布时间:2018-07-01 12:00:10编辑:Run阅读(5267)
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操作已存在表的问题
上一篇: django--ORM的单表操作
下一篇: django--ajax的使用,应用
47742
46232
37105
34624
29226
25881
24741
19860
19413
17905
5712°
6311°
5830°
5884°
6980°
5826°
5841°
6357°
6312°
7669°