zoukankan      html  css  js  c++  java
  • 我的django之旅(三)数据库和模型

    我的django之旅(三)模型和数据库

    标签(空格分隔):模型 数据库 ORM


    1.django ORM

    django内置了一套完整的解决方案,其中就包括他自己的ORM。可惜没有使用SQLAlchemy,SQLAlchemy虽然学习曲线比较高,但基本上是python-orm的标准了,是不可避免的。ORM,全称(Object-Relationship-Mapping),对象关系映射。在MVC方式的开发中,Model代表数据模型,当我们使用数据库时不免要和SQL打交道。既然是面向对象编程,那么orm提供了一种新的方式和数据库打交道,每个数据模型实例都对应着数据库中的一行数据,对对象的操作就是对数据库中数据的操作

    ps:ORM和传统操作相比,效率低了很多,为什么我们要使用orm呢?
    还记得曾经看过一本书《黑客与画家》,里面有一章令我印象深刻。大意是:关于互联网创业,最重要的是先做一个产品出来,尽快上线,什么密码修改,密码找回这些功能全部不要管。为什么?因为我们最主要的目的是发掘市场,当一个产品发布后,看看他能产生多大的影响,一个没有市场的产品,纵然做得尽善尽美也没用。后期再把有市场的产品不断迭代做好。
    ORM虽然操作效率低,但是开发效率高,避免出错。相比使用传统地数据库操作方式,能有效地缩减开发周期。

    2.配置我们的数据库

    使用orm框架的好处之一就是,无论我们使用哪种数据库都可以做到很好的迁移。因为不同数据库的sql语法有一定的差别。通过配置,我们就可以轻松使用不同的数据库
    查看settings.py文件:

    DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
    }
    

    这里配置的是sqlite数据库系统,sqlite麻雀虽小,五脏俱全,作为开发我们完全可以使用它。但是它也有自己的缺陷,sqlite并不是一个client/server的数据库,缺乏解决大型项目问题的能力,正如sqlite开发者自己所言,他们只是和fopen()竞争。一个访问量10K/day的网站完全可以使用sqlite,比如个人博客网站。
    所以我使用的是mysql数据库,原因如下:免费,好安装,国内大多数企业都在用它。

    mysql的配置如下:

    DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
    }
    

    mysql的端口号是3306
    使用mysql的时候会报错:no moudle named "MySQLdb",这是因为我们没有安装这个包

    sudo apt-get install python-dev
    pip install MySQL-python
    

    3.创建数据模型

    模型其实就是一个python类,使用java开发就是java类etc。模型的存放地点是我们的应用的models.py文件中。每个模型都要继承models.Model类

    class Category(models.Model):
    name=models.CharField(max_lenth=128,unique=True)
    
    def __unicode__(self):
    	return self.name
    
    class Page(models.Model):
    	category=models.ForeignKey(Category)
        title=models.CharField(max_lenth=128)
    	url=models.URLField()
        views=models.IntegerField(defautl=0)
        
        def __unicode__(self):
    	   return self.title
    

    第二个类中的foreignKey字段包含了category,说明category是外键。有个奇怪的地方,当我们设计数据库表的时候,隐含的表明我们必须设计一个与数据不相关的ID字段,通常设为自增长,作为我们的主键。可是这里却没有,别慌,django十分善意,已经自动给我们设计了一个自动增长的id字段。

    4.数据库迁移

    当我们修改了模型的字段,往往意味着数据库中的表字段也要改变,这时候就需要用到数据库迁移了。django1.7以上版本提供了一个数据库迁移的工具。
    执行命令:

    python manage.py makemigrations
    python manage.py migrate
    

    每当我们对模型进行了修改或者是添加新的模型,都需要通过 _python manage.py makemigrations_命令进行注册
    但是光是注册还不能真正将修改应用到数据库中,需要_python manage.py migrate_命令在数据库中修改表字段或新建表。

    5.在shell中操作model

    shell是外壳的意思,windows中有cms,powershell,linux下自带shell,是我们敲命令的地方。
    在命令行直接输入python,肯定不能够操作我们的models,必须通过这个命令

    python manage.py shell
    

    操作如下:

    >>> from rango.models import Category
    >>> print Category.objects.all()
    []
    >>> c=Category(name='test')
    >>> c.save()
    >>> print Category.objects.all()
    [<Category: test>]
    

    在这组操作中我们新建了一个Category实例,并将他保存起来。

    6.超级用户

    (1)超级用户(super user).django内置了许多的应用,其中有一个应用可以让我们方便地管理后台,只需简单的几行代码就可以了。

    python manage.py createsuperuser
    

    运行我们的项目,进入http://127.0.0.1:8000/admin/可以看到我们的管理后台已经生成了,但是没有我们项目中的模型,也就是还不能管理我们自己的数据。

    (2)配置应用中的admin.py文件
    注册数据模型

    from rango.models import Category, Page
    
    admin.site.register(Category)
    admin.site.register(Page)
    

    再刷新页面,就可以看到我们的模型了,可以对数据增删改查。这个功能简直惊为天人,也是我觉得django最好用的地方之一。
    注意:要记住密码和账号

    7.批量生成测试数据

    如果我们在一个开发团队中,可能每个人都必须在自己的工程上,输入不同的测试数据,那么django非常贴心的提供了一个功能。可以自动生成测试数据,那么团队中的每个开发者都可以得到相同的测试数据了。
    在项目目录下也就是和static,templates等同级目录下,新建一个python文件populate_rango.py。在文件中添加代码

    add_page(cat=python_cat,
        title="How to Think like a Computer Scientist",
        url="http://www.greenteapress.com/thinkpython/")
    
    add_page(cat=python_cat,
        title="Learn Python in 10 Minutes",
        url="http://www.korokithakis.net/tutorials/python/")
    
    django_cat = add_cat("Django")
    
    add_page(cat=django_cat,
        title="Official Django Tutorial",
        url="https://docs.djangoproject.com/en/1.5/intro/tutorial01/")
    
    add_page(cat=django_cat,
        title="Django Rocks",
        url="http://www.djangorocks.com/")
    
    add_page(cat=django_cat,
        title="How to Tango with Django",
        url="http://www.tangowithdjango.com/")
    
    frame_cat = add_cat("Other Frameworks")
    
    add_page(cat=frame_cat,
        title="Bottle",
        url="http://bottlepy.org/docs/dev/")
    
    add_page(cat=frame_cat,
        title="Flask",
        url="http://flask.pocoo.org")
    
    # Print out what we have added to the user.
    for c in Category.objects.all():
        for p in Page.objects.filter(category=c):
            print "- {0} - {1}".format(str(c), str(p))
    
    def add_page(cat, title, url, views=0):
        p = Page.objects.get_or_create(category=cat, title=title)[0]
        p.url=url
        p.views=views
        p.save()
        return p
    
    def add_cat(name):
        c = Category.objects.get_or_create(name=name)[0]
        return c
    
    # Start execution here!
    if __name__ == '__main__':
        print "Starting Rango population script..."
        populate()
    

    运行文件

    python populate_rango.py
    

    文件,数据就已经被写入数据库了。进入admin页面即可查看

    8.总结

    (1)在settings.py文件中配置需要连接什么数据库
    (2)在应用的models.py中创建模型
    (3)在admin.py中注册我们的model
    (4)将模型映射到数据库

    python manage.py makemigrations
    python manage.py migrate
    

    (5)通过populate脚本,向数据库中添加数据
    (6)运行程序,在admin页面中查看,发现数据已经添加到数据库中了。

  • 相关阅读:
    客车网上订票系统项目--会员管理、前端注册页面
    客车网上订票系统项目--管理员管理、前端用户留言
    客车网上订票系统项目--新闻模块
    后端模块-管理员登录、显示留言列表
    前端模块--首页留言页编辑
    前端模块--登录注册界面编辑
    JVM深入理解(一) -JVM初识
    45:漏洞发现-API接口服务之漏洞探针类型利用修复
    42:漏洞发现-操作系统之漏洞探针类型利用修复
    linux系统安全-2
  • 原文地址:https://www.cnblogs.com/liaozhichao/p/4909223.html
Copyright © 2011-2022 走看看