您的位置:首页 > 编程语言 > Python开发

python django框架的模型的创建

2017-11-24 17:34 489 查看
最近在读djangobook,这也算是写的一篇笔记吧,模型这块的内容链接在这。http://djangobook.py3k.cn/2.0/chapter05/

为了方便对数据库进行操作,django中有模型(models)这个概念

也就是djangoMTV模型中M这一部分,关于数据的存取.

数据库的配置

首先我们需要安装好数据库驱动,可以使用mysqlclient或者MySQl-python。

可以使用pip安装也可以使用tar包

pip install mysqlclient #本人使用的mysqlclient


然后在django的目录下修改settings.py

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


数据库这一部分修改成这个样子。

然后在命令行中输入以下代码测试数据库是否能够连接成功

>>> from django.db import connection
>>> cursor = connection.cursor()


需要注意的是这里要用python manage.py shell来启动命令行。

创建app并且定义模型

在目录djangotest下的djangotest目录执行以下命令来生成一个app

python manage.py startapp books


然后可以看到这个目录的结构为

books/
__init__.py
models.py
tests.py
views.py


在一个app中完全包括了MTV中的模型、模板和视图。

打开这个books目录下的models.py编写如下,定义两个类对象

from django.db import models

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()


有点类似于使用SQL语句定义一个表的结构,原文中给出的对比如下

CREATE TABLE "books_publisher" (
"id" serial NOT NULL PRIMARY KEY,
"name" varchar(30) NOT NULL,
"address" varchar(50) NOT NULL,
"city" varchar(60) NOT NULL,
"state_province" varchar(30) NOT NULL,
"country" varchar(50) NOT NULL,
"website" varchar(200) NOT NULL
);


模块的安装

回到上一级目录修改settings.py文件

MIDDLEWARE_CLASSES = (
# 'django.middleware.common.CommonMiddleware',
# 'django.contrib.sessions.middleware.SessionMiddleware',
# 'django.contrib.auth.middleware.AuthenticationMiddleware',
)

INSTALLED_APPS = (
# 'django.contrib.auth',
# 'django.contrib.contenttypes',
# 'django.contrib.sessions',
# 'django.contrib.sites',
'djangotest.books',
)


使用如下命令来生成SQL语句

python manage.py makemigrations books


然后执行到数据库中

python manage.py migrate


最后表的结构就写到了数据中。

数据的一些操作方法

使用python manage.py shell启动命令行

输入以下代码

In [1]: from pangjingzeshabi.books.models import Publish
...: er

In [2]: p1 = Publisher(name='Apress', address='2855 Tele
...: graph Avenue',
...: ...     city='Berkeley', state_province='CA', co
...: untry='U.S.A.',
...: ...     website='http://www.apress.com/')

In [3]: p1.save()

In [4]: p2 = Publisher(name="O'Reilly", address='10 Fawc
...: ett St.',
...: ...     city='Cambridge', state_province='MA', c
...: ountry='U.S.A.',
...: ...     website='http://www.oreilly.com/')

In [5]: p2.save()

In [6]: publisher_list = Publisher.objects.all()

In [7]: publisher_list
Out[7]: <QuerySet [<Publisher: Publisher object>, <Publisher: Publisher object>, <Publisher: Publisher object>, <Publisher: Publisher object>]>


需要注意的是

只有调用了该对象的 save() 方法以后这些数据才保存到数据库中。

p1=Pubisher(…)

这段代码类似于SQL语句中insert into Publisher ….

在类中我们可以通过重写特殊方法来修改字符串的表现。具体不详细记录

编写def unicode()

一些对象基本的方法如下

In [1]: p.name = 'Apress Publishing'
In [2]: p.save()


对应的是SQL的UPDATE语句

In [8]: Publisher.objects.all()
Out[8]: <QuerySet [<Publisher: Publisher object>, <Publisher: Publisher object>, <Publisher: Publisher object>, <Publisher: Publisher object>]>


对应的是SQL的SELECT * FROM …语句

但是在django中不会这样使用,只会把所有的列名写在SELECT之后。

In [9]: Publisher.objects.filter(name='Apress')
Out[9]: <QuerySet [<Publisher: Publisher object>, <Publisher: Publisher object>]>


对应的是SELECT语句使用时的WHERE字句,用于筛选和过滤数据。

需要注意的时filter方法中的参数增多后,会自动的起到SQL中AND子句的作用。

In [10]:  Publisher.objects.filter(name__contains="press
...: ")
Out[10]: <QuerySet [<Publisher: Publisher object>, <Publisher: Publisher object>]>


在name后面加了两个下划线和contains,是一个魔法方法,对应的是LIKE子句

WHERE name LIKE '%press%';


In [11]:  Publisher.objects.get(name="press
...: ")
Out[11]: <QuerySet [<Publisher: Publisher object>, <Publisher: Publisher object>]>


获取某个对象

Publisher.objects.orderby("name")


对应的是SQL语句中的ORDER BY子句
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python django