django操作非ORM创建的表

发布时间: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条记录

    blob.png


    关于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

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


    访问页面:  (报错)

    blob.png


    会报错找不到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


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

    blob.png


    虽然可以用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 


    访问页面:

    blob.png

    查询成功


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

    修改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


    访问页面:

    blob.png


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


关键字