Django学习笔记(第五节)模型(1)

 就像HTML可以硬编码在views.py中一样,Django的数据库操作也可以在views.py中进行。

由于在创建Django项目的时候会自动添加sqlite,所以这里以sqlite数据库为例:

def book_list(request):
    cursor = connection.cursor()
    cursor.execute('create table if no exits books (id integer primary key autoincrement , name varchar(60) )')
    cursor.execute('SELECT name FROM books ORDER BY name')
    names = [row[0] for row in cursor.fetchall()]
    cursor.close()
    return render_to_response('book_list.html', {'names':names})
当我们一次次去连接数据库,编写sql,甚至是换数据库时,这种写法就非常不方便了。

Django致力于解决这样的问题:

from django.shortcuts import render_to_response
from mysite.books.models import Book

def book_list(request):
    books = Book.objects.order_by('name')
    return render_to_response('book_list.html', {'books': books})

在了解模型之前,我们先回顾一下MVC和MTV模式。

MTV 开发模式

Model-View-Controller (MVC)模式是把数据存取逻辑、业务逻辑和表现逻辑组合在一起的软件架构模式。

在这个模式中, Model 代表数据存取层,View 代表的是视图部分,Controller 指的是系统中根据用户输入并视需要访问模型,以决定使用哪个视图的那部分。

MVC模式有广泛的应用,从struts到android都使用了MVC模式。

Django中MVC模式的含义

M ,数据存取部分,由django数据库层处理,本章要讲述的内容。

V ,选择显示哪些数据要显示以及怎样显示的部分,由视图和模板处理。

C ,根据用户输入委派视图的部分,由 Django 框架根据 URLconf 设置,对给定 URL 调用适当的 Python 函数。

由于 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。在 MTV 开发模式中:

M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。

T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。

V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。

数据库配置

如果是使用sqlite的话就不需要进行数据库配置。其他数据库则需要进行配置。

打开setting.py,查找数据库配置:

DATABASE_ENGINE = ''#Django使用的数据库引擎
DATABASE_NAME = ''#数据库名称
DATABASE_USER = ''#用户,sqlite空即可
DATABASE_PASSWORD = ''#密码,sqlite空
DATABASE_HOST = ''#数据库服务器主机地址,如果Django与数据库在同一台计算机上,可以保留空白
DATABASE_PORT = ''#主机端口
例如如sqlite,则是以下配置:

# Database
# https://docs.djangoproject.com/en/1.7/ref/settings/#databases

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

第一个应用程序

根据约定,如果使用Django数据库模型,就必须创建一个Django app。模型必须存放在apps中。

如果使用的开发工具是eclipse+pydev,只需要右键你的poject-->Django-->Create Application(manage.py startapp),在弹出的对话框中数据你的app名称即可。

如果使用命令那么进入你的工程目录,输入命令:python manage.py startapp books

在Python代码里定义模型

在代码中定义模型也是有一些弊端的,如果你修改了一个Django模型, 你要自己来修改数据库来保证和模型同步。

Django提供了实用工具来从现有的数据库表中自动扫描生成模型。 这对已有的数据库来说是非常快捷有用的。

第一个模型

我们来假定下面的这些概念、字段和关系:

一个作者有姓,有名及email地址。

出版商有名称,地址,所在城市、省,国家,网站。

书籍有书名和出版日期。 它有一个或多个作者(和作者是多对多的关联关系[many-to-many]), 只有一个出版商(和出版商是一对多的关联关系[one-to-many],也被称作外键[foreign key])

打开models.py文件,输入代码

class Publisher(models.Model):
    name= models.CharField(max_length=30)
    address= models.CharField(max_length=50)
    city= models.CharField(max_length=60)
    state_province= models.CharField(max_length=30)
    country= models.CharField(max_length=50)
    website = models.URLField()

class Author(models.Model):
    first_name= models.CharField(max_length=30)
    last_name= models.CharField(max_length=40)
    email=models.EmailField()

class Book(models.Model):
    title=models.CharField(max_length=100)
    #多对多
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()
这三个class实际上相当于创建了三张表。

模型安装

打开settings.py文件,找打INSTALLED_APPS,注释掉初始默认值,在结尾添加上『'mysite.books',』,注意结尾的逗号一定要有。

在1.4教程中:

执行python manage.py validate命令检查模型的语法和逻辑是否正确。

然后执行python manage.py sqlall books命令,其中books是APP名称。

我使用的是Django1.7,如果执行这两个命令,会报importError:No module namede books

查看了一下官方文档,说是使用新命令python manage.py makemigrations books

据论坛网友亲测 1.6版本python manage.py sql books,1.8版本与1.7一致。

输入命令提示成功如下:

这时候刷新项目,发现books->migrations下多出来一个0001_initial.py的文件。里面就是一下创建的方法。

然后我执行了python manage.py syncdb命令,在命令行中引导我设置了用户名密码和邮箱。

然后执行python manage.py shell命令,输入代码:

>>> from books.models import Publisher
>>> p1 = Publisher(name='Apress', address='2855 Telegraph Avenue',
...     city='Berkeley', state_province='CA', country='U.S.A.',
...     website='http://www.apress.com/')
>>> p1.save()
>>> p2 = Publisher(name="O'Reilly", address='10 Fawcett St.',
...     city='Cambridge', state_province='MA', country='U.S.A.',
...     website='http://www.oreilly.com/')
>>> p2.save()
>>> publisher_list = Publisher.objects.all()
>>> publisher_list
[<Publisher: Publisher object>, <Publisher: Publisher object>]
这段代码的含义是导入Publisher类,设置p1的字段值,调用save方法保存到数据库。Publisher.objects.all()方法的底层实际是一个SQL的select语句。

需要注意到是,只有调用了save方法,数据才会真正保存到数据库。

当然也可以一步完成创建对象和保存到数据库的操作,只要使用Publisher.objects.create方法,参数写法与上例中的相同。


至此模型的创建,以及添加数据,读取数据都已经完成了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习Django时,使用PyCharm作为开发工具可以提高效率。PyCharm是一款功能强大的Python集成开发环境,它提供了丰富的功能和工具,可以帮助开发者更好地编写和调试Django应用程序。 在学习Django的过程中,可以使用PyCharm创建Django项目,并使用其内置的Django支持功能来简化开发过程。PyCharm可以自动识别Django项目的结构,并提供代码补全、语法检查、调试等功能,帮助开发者更快地编写和调试代码。 此外,PyCharm还提供了集成的版本控制系统,如Git,可以方便地管理和追踪代码的变化。它还支持自动化测试和部署,可以帮助开发者更好地进行项目管理和发布。 总之,使用PyCharm作为开发工具可以提高Django学习的效率和便利性。它的强大功能和友好的用户界面使得开发者可以更专注于代码的编写和项目的开发。\[1\] \[2\] \[3\] #### 引用[.reference_title] - *1* *3* [PyCharm平台下初学Django框架](https://blog.csdn.net/howard2005/article/details/93491364)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [pycharm平台下的Django教程](https://blog.csdn.net/Sunshine_ZCC/article/details/73918408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值