51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1830|回复: 1
打印 上一主题 下一主题

Django 数据库的操作

[复制链接]
  • TA的每日心情
    擦汗
    昨天 09:05
  • 签到天数: 525 天

    连续签到: 2 天

    [LV.9]测试副司令

    跳转到指定楼层
    1#
    发表于 2019-1-2 14:46:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 测试积点老人 于 2019-1-2 14:49 编辑

    Django 紧紧地遵循这种 MVC 模式,可以称得上是一种 MVC 框架。以下是 Django 中 M、V 和 C 各自的含义:

    • M ,数据存取部分,由django数据库层处理,本章要讲述的内容。
    • V ,选择显示哪些数据要及怎样显示的部分,由视图和模板处理。
    • C ,根据用户输入委派视图的部分,由 Django 框架通过按照 URLconf 设置,对给定 URL 调用合适的 python 函数来自行处理。


    由于 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。在 MTV 开发模式中:
    • M 代表模型(Model),即数据存取层。该层处理与数据相关的所有事务:如何存取、如何确认有效性、包含哪些行为以及数据之间的关系等。
    • T 代表模板(Template),即表现层。该层处理与表现相关的决定:如何在页面或其他类型文档中进行显示。
    • V 代表视图(View),即业务逻辑层。该层包含存取模型及调取恰当模板的相关逻辑。你可以把它看作模型与模板之间的桥梁。


    models.py就是Django里面的建表所需的数据模型的描述:

    命令:

    python manage.py init 初始化数据库

    python manage.py sqlall [appname] 查看app的CREATE TABLE的语句,包括原始数据,创建索引等.

    python manage.py sqlreset [appname] 修改models,不保留以前数据,进行重置数据库,更新表。

    python manage.py validate 用来排错

    python manage.py syncdb 用来建表

    python manage.py sql databasename 用来查看已创建数据库表结构


    数据库建表过程:
    1.创建应用程序
    1. python manage.py startapp appname
    复制代码

    2.用python代码写models.py,创建数据模型
    1. from django.db import models

    2. class Publisher(models.Model):
    3.     name = models.CharField(maxlength=30)
    4.     address = models.CharField(maxlength=50)
    5.     city = models.CharField(maxlength=60)
    6.     state_province = models.CharField(maxlength=30)
    7.     country = models.CharField(maxlength=50)
    8.     website = models.URLField()
    复制代码
    3.模型的安装
    编辑settings.py
    添加:
    INSTALLED_APPS=(
            'mysite.appname',
    }

    4.创建数据库表:
    python manage.py validate    (验证模型有效性)
    python manage.py sqlall appname (生成CREATE TABLE语句)
    python manage.py syncdb (执行上一步产生的SQL语句,简表。不执行上一句也可以建,也可以把上一句执行产生的SQL语句放入SQL客户端去执行,syncdb 仅仅创建数据库中不存在的表,而不会同步模型的修改或者删除到数据库)

    5.插入和更新数据
    插入数据:
    定义对象
    p = Publisher(.....)         //将新的内容放到Publisher里面赋给对象p
    p.save()       //完成插入

    上面相当于SQL语言:
    1. INSERT INTO book_publisher
    2.     (name, address, city, state_province, country, website)
    3. VALUES
    4.     ('Apress', '2855 Telegraph Ave.', 'Berkeley', 'CA',
    5.      'U.S.A.', 'http://www.apress.com/');
    复制代码
    更新数据:
    p.name = 'NewName'        //修改对象p的名字
    p.save()         //完成存储

    上面相当于SQL语言:
    1. UPDATE book_publisher SET
    2.     name = 'NewName',
    3.     address = '2855 Telegraph Ave.',
    4.     city = 'Berkeley',
    5.     state_province = 'CA',
    6.     country = 'U.S.A.',
    7.     website = 'http://www.apress.com'
    8. WHERE id = 52;
    复制代码
    选择对象:
    Publisher.objects.all()
    相当于SQL:
    1. SELECT
    2.     id, name, address, city, state_province, country, website
    3. FROM book_publisher;
    复制代码
    数据过滤:
    1. Publisher.objects.filter(name="NewName")
    2. 相当于SQL语句:
    3. SELECT
    4.     id, name, address, city, state_province, country, website
    5. FROM book_publisher
    6. WHERE name = 'NewName';

    7. 缩小范围:
    8. Publisher.objects.filter(country="U.S.A.", state_province="CA")
    9. 相当于SQL语句:

    10. SELECT
    11.     id, name, address, city, state_province, country, website
    12. FROM book_publisher
    13. WHERE country = 'U.S.A.' AND state_province = 'CA';

    14. 模糊匹配:
    15. Publisher.objects.filter(name__contains="press")
    复制代码

    在 name 和 contains 之间有双下划线。象Python自己一样,Django也使用 双下划线来做一些小魔法,这个 __contains 部分会被Django转换成 LIKE SQL语句:

    SELECT id, name, address, city, state_province, country, website FROM book_publisher WHERE name LIKE '%press%';

    获取单个对象:
    1. Publisher.objects.get(name="Apress Publishing")数据排序:   Publisher.objects.order_by("name")
    2. 相当于SQL语句:
    3. SELECT
    4.     id, name, address, city, state_province, country, website
    5. FROM book_publisher
    6. ORDER BY name;

    7. 可以支持多个字段排序:
    8. Publisher.objects.order_by("state_provice", "address")

    9. 也可以逆向排序:
    10. Publisher.objects.order_by("-name") 添加‘-’同时排序和过滤:  Publisher.objects.filter(country="U.S.A.").order_by("-name")
    11. 相当于SQL语句:
    12. SELECT
    13.     id, name, address, city, state_province, country, website
    14. FROM book_publisher
    15. WHERE country = 'U.S.A'
    16. ORDER BY name DESC; 限制返回数据:  Publisher.objects.all()[Number]    //Number可以换成想要显示的位置下标
    17. 相当于SQL语句:
    18. SELECT
    19.     id, name, address, city, state_province, country, website
    20. FROM book_publisher
    21. ORDER BY name
    22. LIMIT 1; 删除对象:p = Publisher.objects.get(name="NewName")
    23. p.delete()
    复制代码
    修改数据库表结构:

    添加字段:

    首先,在开发环境中执行下面的步骤(也就是说,不是在发布服务器上):

    • 把这个字段添加到你的模型中.

    • 运行 manage.py sqlall [yourapp] 会看到模型的新的 CREATE TABLE 语句。 注意新的字段的列定义。

    • 启动您的数据库交互shell(也就是 psql 或 mysql , 或者您也可以使用 manage.py dbshell )。 执行一个 ALTER TABLE 语句,添加您的新列。SQL语句:(ALTER TABLE books_publisher ADD COLUMN test integer)
    • (可选)用 manage.py shell 启动Python交互式shell,并通过引入模型并选择表 验证新的字段已被正确添加。

    删除字段:
    1. ALTER TABLE books_book DROP COLUMN test;删除表:DROP TABLE books_book
    复制代码


    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-14 08:59 , Processed in 0.058872 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表