Django学习笔记(三)—— 型号 model
疯狂暑期学习 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的更多相关文章
- Crusher Django 学习笔记4 使用Model
http://crusher-milling.blogspot.com/2013/09/crusher-django-tutorial4-using-basic.html 顺便学习一下FQ Crush ...
- Django学习笔记:为Model添加Action
|- Django版本:1.8 |- Python版本:3.4 models.py 1 class Story(models.Model): #编辑Story状态 STATUS_CHOICES = ( ...
- Django 学习笔记(三)模板导入
本章内容是将一个html网页放进模板中,并运行服务器将其展现出来. 平台:windows平台下Liunx子系统 目前的目录: hello ├── manage.py ├── hello │ ├── _ ...
- Django 学习笔记(七)数据库基本操作(增查改删)
一.前期准备工作,创建数据库以及数据表,详情点击<Django 学习笔记(六)MySQL配置> 1.创建一个项目 2.创建一个应用 3.更改settings.py 4.更改models.p ...
- Django 学习笔记(六)MySQL配置
环境:Ubuntu16.4 工具:Python3.5 一.安装MySQL数据库 终端命令: sudo apt-get install mysql-server sudo apt-get install ...
- Django学习笔记(9)—— 开发用户注册与登录系统
一,项目题目: 开发用户注册与登录系统 该项目主要练习使用Django开发一个用户注册与登录的系统,通过这个项目然后巩固自己这段时间所学习的Django知识. 二,项目需求: 开发一个简单的用户登录与 ...
- Django学习笔记(4)——Django连接数据库
前言 在MVC或者MTV设计模式中,模型(M)代表对数据库的操作.那么如何操作数据库呢?本小节就认真学习一下.首先复习一下Django的整个实现流程 ,然后再实现一下使用数据库的整个流程,最后学习一下 ...
- Django学习笔记二
Django学习笔记二 模型类,字段,选项,查询,关联,聚合函数,管理器, 一 字段属性和选项 1.1 模型类属性命名限制 1)不能是python的保留关键字. 2)不允许使用连续的下划线,这是由dj ...
- Django学习笔记(13)——Django的用户认证(Auth)组件,视图层和QuerySet API
用户认证组件的学习 用户认证是通过取表单数据根数据库对应表存储的值做比对,比对成功就返回一个页面,不成功就重定向到登录页面.我们自己写的话当然也是可以的,只不过多写了几个视图,冗余代码多,当然我们也可 ...
随机推荐
- More is better(并差集)
More is better Time Limit : 5000/1000ms (Java/Other) Memory Limit : 327680/102400K (Java/Other) To ...
- 【SDUT 3038】迷之博弈
action=showproblem&problemid=3038">[SDUT 3038]迷之博弈 简直就是上次省赛的缩减版... 仅仅只是这个是链 省赛是环. ..1 2先 ...
- Android应用程序与SurfaceFlinger服务之间的共享UI元数据(SharedClient)的创建过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7867340 在前面一篇文章中,我们分析了And ...
- Js apply 方法 具体解释
Js apply方法具体解释 我在一開始看到javascript的函数apply和call时,很的模糊,看也看不懂,近期在网上看到一些文章对apply方法和call的一些演示样例,总算是看的有点眉目了 ...
- 解决net-snmp正确输出MAC地址和判断空的IP地址
function readVarbinds (buffer, varbinds) { buffer.readSequence (); while (1) { buffer.readSequence ( ...
- PHP学习笔记七【函数】
<?php $a=13; function abc3($a) { unset($a);//[释放给定变量]表示不在abc3函数范围内,不在使用$a,后面需要全新定义 $a=45; } abc(3 ...
- VMVare虚拟机的异常处理---内部错误
由于昨天晚上关闭虚机时手快,直接把机器睡眠了.今天早上开机后,虚机显示启动状态,但是无法连接.搜了一下,网上说删掉.lk锁文件就可以了,删掉后,没有反应,强制关闭,再次启动VM,还是打不开,显示内部错 ...
- ASP.NET和PHP全面对比
谁是速度之王? 刚刚在9月编程语言排行榜上取得历史性突破的PHP在Web开发领域最到的对手可能就是基于微软.NET技术的ASP.NET.近日,微软的 Joe Stagner在博客上发表了一系列文章比较 ...
- zoj 1200 Mining
这道题被划到了动态规划里面去了,结果就是一道模拟题,懒了一点,直接用stl的优先队列,重载了一下运算符,写的时候保证只能一个在采,因为如果需要的采的次数比可以生产的次数少,那么生产的次数等于需要采的次 ...
- html 调用 activeX(c++)
1.新建MFC ActiveX 2.添加方法 3.找到add函数编写代码 4.在test.idl中找到最后一个uuid 5.编译工程,会自动注册控件 6.html中的代码 <html> & ...