前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >django操作非ORM创建的表

django操作非ORM创建的表

作者头像
py3study
发布2018-08-03 11:03:56
1.6K0
发布2018-08-03 11:03:56
举报
文章被收录于专栏:python3python3

django--ORM连接已存在的表

问题:

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

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

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

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

代码语言:javascript
复制
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条记录

blob.png
blob.png

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

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

第一次尝试:

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

修改models.py文件:

代码语言:javascript
复制
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

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

访问页面:  (报错)

blob.png
blob.png

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

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

第二次尝试:

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

在mysql里面执行:

代码语言:javascript
复制
mysql> use scrapyDB;
Database changed
mysql> alter table tencent_depth rename app_tencent_depth;
Query OK, 0 rows affected (0.01 sec)

修改models.py文件

代码语言:javascript
复制
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

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

blob.png
blob.png

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

完美解决方案:

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

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

代码语言:javascript
复制
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文件

代码语言:javascript
复制
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 

访问页面:

blob.png
blob.png

查询成功

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

修改models.py文件

代码语言:javascript
复制
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视图函数

代码语言:javascript
复制
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

代码语言:javascript
复制
{% 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

访问页面:

blob.png
blob.png

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-07-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档