疯狂暑期学习 Django学习笔记(三)—— 型号 model

參考:《The Django Book》 第5章

1.setting.py 配置

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.', # 用什么数据库管理系统
'NAME': '', # 数据库名称,假设用sqlite。要写完整路径
'USER': '', # 假设用sqlite,这个不用写
'PASSWORD': '', # 假设用sqlite,这个不用写
'HOST': '', # 告诉Django连接那一台. Not used with sqlite3. 假设用sqlite也空白
'PORT': '', # 设置port。空白就是默认,一般用默认的即可了。对于sqlite没用。
}
}

'ENGINE' 能够有:

'ENGINE'                                                              数据库管理系统             适配器           适配器下载地址

django.db.backends.postgresql_psycopg2                 PostgreSQL              psycopg       http://www.djangoproject.com/r/python-pgsql/.

django.db.backends.mysql                                       MySQL                     MySQLdb     http://www.djangoproject.com/r/python-mysql/

django.db.backends.sqlite3                                      SQLite

django.db.backends.oracle                                       Oracle                       cx_Oracle    http://www.djangoproject.com/r/python-oracle/

注意:用那个DBMS,就要安装相应DBMS的适配器。SQLite的,python默认已经装好了。

可用以下来命令測试数据库配置,假设没有显示错误信息。配置就是正确的。

>>> from django.db import connection

>>> cursor = connection.cursor()

2.创建APP

project跟APP的差别:一个是配置。一个是代码。

一个project能够包括非常多app以及它们的配置。一个app是一套Django功能的集合。通常包括模型和视图。按python的包结构的方式存在。

前面你能够创建app。可是假设要用模型,你就必须创建一个app。模型必须放在apps中。

创建一个“books”模型

python manage.py startapp books

它会创建一个books包,内容例如以下

books/

├── admin.py

├── __init__.py

├── models.py

├── tests.py

└── views.py

然后在settings.py中INSTALLED_APPS中加入 'books'。

3.定义模型,模型安装

样例:

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

Publisher模块相当于:

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

注意:这里没有显示的为这些模型定义不论什么主键。除非指明,Django会自己主动为每一个模型生成一个自增长的单独主键 id

能够用以下的命令验证模型的有效性

python manage.py validate

能够用以下命令生成SQL语句。它这仅仅是生成SQL语句。不会运行

python manage.py sqlall books

假设想运行。运行以下语句(这个语句,在里加入新的模型或者app时才实用,改动删除模型syncdb不会做出不论什么反应)

python manage.py syncdb

4.数据库操作

(1)数据库插入,显示

>>> from books.models
import *

>>> 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>]

单单的p1=Publisher(...)
不会插入。必需要p1.save() 后才会真正生效

假设想一次性完毕插入运行以下的命令

>>> from books.models import *

>>> p1 = Publisher.objects.create(name='Apress',

... address='2855 Telegraph Avenue',

... city='Berkeley', state_province='CA', country='U.S.A.',

... website='http://www.apress.com/')

>>> p2 = Publisher.objects.create(name="O'Reilly",

... address='10 Fawcett St.', city='Cambridge',

... state_province='MA', country='U.S.A.',

... website='http://www.oreilly.com/')

>>> publisher_list = Publisher.objects.all()

>>> publisher_list

[<Publisher: Publisher object>, <Publisher: Publisher object>]

Publisher.objects.all()相当于
select

在输入publisher_list时,返回的对象名字都一样。不好分辨,解决方法就是,在模板类中加入__unicode__()
方法

如:

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() def __unicode__(self):
return self.name

这样又一次启动,输入以下命令,就能够分辨出来。

>>> from books.models
import Publisher

>>> publisher_list
= Publisher.objects.all()

>>> publisher_list

[<Publisher:
Apress>, <Publisher: O'Reilly>]

(2)数据库更新

样例:

>>> p = Publisher(name='Apress',

...     address='2855 Telegraph Ave.',

...      city='Berkeley',

...      state_province='CA',

...      country='U.S.A.',

...         website='http://www.apress.com/')

>>> p.save()

>>> p

<Publisher: Apress>

>>> p.id

3

>>> p.name = 'Apress Publishing'

>>> p.save()

>>> p

<Publisher: Apress Publishing>

注意:以下这样是更行不了的

>>> Publisher.objects.all()[0].name='AAAAAA'

>>> Publisher.objects.all()[0].save()

>>> Publisher.objects.all()[0]

<Publisher: Apress Publishing>

得要这样更新

>>> p = Publisher.objects.get(name='Apress')

>>> p

<Publisher: Apress>

>>> p.name = 'Apress Publishing'

>>> p.save()

>>> p

<Publisher: Apress Publishing>

上面的更行方法,用l了save()。这样无论有没有改过的数据。都会更行。能够用update(...),它仅仅会更新要改的

>>> Publisher.objects.filter(id=1).update(name='Apress')

1

>>> Publisher.objects.all()

[<Publisher: Apress>, <Publisher: O'Reilly>]

可是update(),对结果集(QuerySet)有效,get(),[0]。无效

如以下的命令会报错

>>> Publisher.objects.get(id=1).update(name='Apress')

Traceback (most recent call last):

File "<console>", line 1, in <module>

AttributeError: 'Publisher' object has no attribute 'update'

(3)选择对象

Publisher.objects.all()显示全部对象

>>> Publisher.objects.all()

[<Publisher: Apress>, <Publisher: O'Reilly>]

Publisher.objects.filter(name='Apress')

Publisher.objects.filter(...)
筛选

>>> Publisher.objects.filter(name='Apress')

[<Publisher: Apress>]

filter(...)
能够有多个參数。相当与SQL中的AND

>>> Publisher.objects.filter(country="U.S.A.",state_province="CA")

[<Publisher:
Apress>]

假设想使用SQL中的
LIKE 查询,要用 XX__contains

>>> Publisher.objects.filter(name__contains="press")

[<Publisher: Apress>]

name__contains="press"
相当与  LIKE “%press%”

(4)获取单个对象

filter
仅仅要满足条件的都会输出

获取单个对象用get

>>>
Publisher.objects.get(name='Apress')

<Publisher:
Apress>

假设满足的不止一个会有异常,假设没有会抛出DoesNotExist异常

>>>
Publisher.objects.get(country='U.S.A.')

Traceback
(most recent call last):

File "<console>", line 1, in <module>

File "/usr/lib64/python2.7/site-packages/django/db/models/manager.py", line 151, in get

return self.get_queryset().get(*args, **kwargs)

File "/usr/lib64/python2.7/site-packages/django/db/models/query.py", line 310, in get

(self.model._meta.object_name, num))

MultipleObjectsReturned:
get() returned more than one Publisher -- it returned 2!

(5)数据库排序

用order_by

>>> Publisher.objects.order_by("name")

[<Publisher: Apress>, <Publisher: O'Reilly>]

倒叙,仅仅须要,加上“-”

>>> Publisher.objects.order_by("-name")

[<Publisher: O'Reilly>, <Publisher: Apress>]

(6)连锁查询

样例:

>>> Publisher.objects.filter(country="U.S.A.").order_by("-name")

[<Publisher: O'Reilly>, <Publisher: Apress>]

(7)限制返回查询

样例:

>>> Publisher.objects.order_by("-name")[0]

<Publisher: O'Reilly>

>>> Publisher.objects.order_by("-name")[0:2]

[<Publisher: O'Reilly>, <Publisher: Apress>]

(8)删除对象

用 delete()

>>> Publisher.objects.all()

[<Publisher: Apress>, <Publisher: O'Reilly>]

>>> Publisher.objects.filter(name='Apress').delete()

>>> Publisher.objects.all()

[<Publisher: O'Reilly>]

删除全部对象

>>> Publisher.objects.all().delete()

>>> Publisher.objects.all()

[]

版权声明:本文博主原创文章,博客,未经同意不得转载。

Django学习笔记(三)—— 型号 model的更多相关文章

  1. Crusher Django 学习笔记4 使用Model

    http://crusher-milling.blogspot.com/2013/09/crusher-django-tutorial4-using-basic.html 顺便学习一下FQ Crush ...

  2. Django学习笔记:为Model添加Action

    |- Django版本:1.8 |- Python版本:3.4 models.py 1 class Story(models.Model): #编辑Story状态 STATUS_CHOICES = ( ...

  3. Django 学习笔记(三)模板导入

    本章内容是将一个html网页放进模板中,并运行服务器将其展现出来. 平台:windows平台下Liunx子系统 目前的目录: hello ├── manage.py ├── hello │ ├── _ ...

  4. Django 学习笔记(七)数据库基本操作(增查改删)

    一.前期准备工作,创建数据库以及数据表,详情点击<Django 学习笔记(六)MySQL配置> 1.创建一个项目 2.创建一个应用 3.更改settings.py 4.更改models.p ...

  5. Django 学习笔记(六)MySQL配置

    环境:Ubuntu16.4 工具:Python3.5 一.安装MySQL数据库 终端命令: sudo apt-get install mysql-server sudo apt-get install ...

  6. Django学习笔记(9)—— 开发用户注册与登录系统

    一,项目题目: 开发用户注册与登录系统 该项目主要练习使用Django开发一个用户注册与登录的系统,通过这个项目然后巩固自己这段时间所学习的Django知识. 二,项目需求: 开发一个简单的用户登录与 ...

  7. Django学习笔记(4)——Django连接数据库

    前言 在MVC或者MTV设计模式中,模型(M)代表对数据库的操作.那么如何操作数据库呢?本小节就认真学习一下.首先复习一下Django的整个实现流程 ,然后再实现一下使用数据库的整个流程,最后学习一下 ...

  8. Django学习笔记二

    Django学习笔记二 模型类,字段,选项,查询,关联,聚合函数,管理器, 一 字段属性和选项 1.1 模型类属性命名限制 1)不能是python的保留关键字. 2)不允许使用连续的下划线,这是由dj ...

  9. Django学习笔记(13)——Django的用户认证(Auth)组件,视图层和QuerySet API

    用户认证组件的学习 用户认证是通过取表单数据根数据库对应表存储的值做比对,比对成功就返回一个页面,不成功就重定向到登录页面.我们自己写的话当然也是可以的,只不过多写了几个视图,冗余代码多,当然我们也可 ...

随机推荐

  1. WebBot - Build Web Apps as Easily as Native Ones - Home

    Python-based Template Packages Python-based Template Packages WebBot - Build Web Apps as Easily as N ...

  2. poj 2377 Bad Cowtractors(最大生成树!)

    Description Bessie has been hired to build a cheap internet network among Farmer John's N (2 <= N ...

  3. Android学习总结——实现Home键功能

    实现Home键功能简而言之就是回到桌面,让Activity不销毁,程序后台运行. 实现方法: Intent intent= new Intent(Intent.ACTION_MAIN); intent ...

  4. 单调队列-hdu-3415-Max Sum of Max-K-sub-sequence

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3415 题目大意: 给n个数凑成环状,求某一区间,使得该区间长度不超过k,且总和最大. 解题思路: 区 ...

  5. iOS开发-21UINavigationController导航控制器初始化 导航控制器栈的push和pop跳转理解

    (1)导航控制器初始化的时候一般都有一个根视图控制器,导航控制器相当于一个栈,里面装的是视图控制器,最先进去的在最下面,最后进去的在最上面.在最上面的那个视图控制器的视图就是这个导航控制器对外展示的界 ...

  6. linux查看用户登录信息2-who命令

    who命令与w命令相似,但要比w命令显示更加详细的信息.[root@rusky opt]# man who WHO(1) User Commands WHO(1) NAME who - show wh ...

  7. 项目总结之SSI (一)

    这是我进公司之后做的第一个新项目,从无到有. 去年夏天和同事在会议室里度过的日子还恍如昨日啊,时光啊,你慢些走... 作为一个外部项目,美工设计了一个Win8风格的界面,看到现在做前台的同学做的一样是 ...

  8. 初入 Spring.net

    IOC:Inversion Of Control 控制翻转:就是创建对象的权利由开发人员自己控制,转换到了由容器来控制 我用的是winform里的一个按键来触发的 首先要引入两个Spring.net的 ...

  9. HDU 5791 Two

    题意:给两个序列,求公共序列的个数 分析:很自然想到最长公共子序列的转移的转移形式,用dp[i][j]表示第一个串前i个 和第二个串前j个匹配的答案数量,a[i]==b[i],dp[i][j]=dp[ ...

  10. ios 75个工具

    如果你去到一位熟练的木匠的工作室,你总是能发现他/她有一堆工具来完成不同的任务.   软件开发同样如此.你可以从软件开发者如何使用工具中看出他水准如何.有经验的开发者精于使用工具.对你目前所使用的工具 ...