Django里的模型是对数据库对表的一次封装,是应用业务与数据之间的桥梁

要想使用Django的models 首先得配置settings

Django默认使用的是sqlite,我使用的Mysql,配置如下

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'day13',
'USER': 'root',
'PASSWORD': '',
'HOST': '',
'PORT': '',
}
}

  

1. 模型的Fields

# AutoField
# 一个 IntegerField, 添加记录时它会自动增长. 你通常不需要直接使用这个字段; 如果你不指定主键的话,系统会自动添加一个主键字段到你的 model.(参阅 _自动主键字段)
# BooleanField
# A true/false field. admin 用 checkbox 来表示此类字段.
# CharField
# 字符串字段, 用于较短的字符串.
#
# 如果要保存大量文本, 使用 TextField.
#
# admin 用一个 <input type="text"> 来表示此类字段 (单行输入).
#
# CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数.
#
# CommaSeparatedIntegerField
# 用于存放逗号分隔的整数值. 类似 CharField, 必须要有 maxlength 参数.
# DateField
# 一个日期字段. 共有下列额外的可选参数:
#
# Argument 描述
# auto_now 当对象被保存时,自动将该字段的值设置为当前时间.通常用于表示 "last-modified" 时间戳.
# auto_now_add 当对象首次被创建时,自动将该字段的值设置为当前时间.通常用于表示对象创建时间.
# admin 用一个文本框 <input type="text"> 来表示该字段数据(附带一个 JavaScript 日历和一个"Today"快键.
#
# DateTimeField
# 一个日期时间字段. 类似 DateField 支持同样的附加选项.
# admin 用两上文本框 <input type="text"> 表示该字段顺序(附带JavaScript shortcuts).
#
# EmailField
# 一个带有检查 Email 合法性的 CharField,不接受 maxlength 参数.
# FileField
# 一个文件上传字段.
#
# 要求一个必须有的参数: upload_to, 一个用于保存上载文件的本地文件系统路径. 这个路径必须包含 strftime formatting, 该格式将被上载文件的 date/time 替换(so that uploaded files don't fill up the given directory).
#
# admin 用一个``<input type="file">``部件表示该字段保存的数据(一个文件上传部件) .
#
# 在一个 model 中使用 FileField 或 ImageField 需要以下步骤:
#
# 在你的 settings 文件中, 定义一个完整路径给 MEDIA_ROOT 以便让 Django在此处保存上传文件. (出于性能考虑,这些文件并不保存到数据库.) 定义 MEDIA_URL 作为该目录的公共 URL. 要确保该目录对 WEB 服务器用户帐号是可写的.
# 在你的 model 中添加 FileField 或 ImageField, 并确保定义了 upload_to 选项,以告诉 Django 使用 MEDIA_ROOT 的哪个子目录保存上传文件.
# 你的数据库中要保存的只是文件的路径(相对于 MEDIA_ROOT). 出于习惯你一定很想使用 Django 提供的 get_<fieldname>_url 函数.举例来说,如果你的 ImageField 叫作 mug_shot, 你就可以在模板中以 {{ object.get_mug_shot_url }} 这样的方式得到图像的绝对路径.
# FilePathField
# 可选项目为某个特定目录下的文件名. 支持三个特殊的参数, 其中第一个是必须提供的.
#
# 参数 描述
# path 必需参数. 一个目录的绝对文件系统路径. FilePathField 据此得到可选项目. Example: "/home/images".
# match 可选参数. 一个正则表达式, 作为一个字符串, FilePathField 将使用它过滤文件名. 注意这个正则表达式只会应用到 base filename 而不是路径全名. Example: "foo.*\.txt^", 将匹配文件 foo23.txt 却不匹配 bar.txt 或 foo23.gif.
# recursive 可选参数.要么 True 要么 False. 默认值是 False. 是否包括 path 下面的全部子目录.
# 这三个参数可以同时使用.
#
# 我已经告诉过你 match 仅应用于 base filename, 而不是路径全名. 那么,这个例子:
#
# FilePathField(path="/home/images", match="foo.*", recursive=True)
# ...会匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif
#
# FloatField
# 一个浮点数. 必须 提供两个 参数:
#
# 参数 描述
# max_digits 总位数(不包括小数点和符号)
# decimal_places 小数位数
# 举例来说, 要保存最大值为 999 (小数点后保存2位),你要这样定义字段:
#
# models.FloatField(..., max_digits=5, decimal_places=2)
# 要保存最大值一百万(小数点后保存10位)的话,你要这样定义:
#
# models.FloatField(..., max_digits=19, decimal_places=10)
# admin 用一个文本框(<input type="text">)表示该字段保存的数据.
#
# ImageField
# 类似 FileField, 不过要校验上传对象是否是一个合法图片.它有两个可选参数:height_field 和 width_field,如果提供这两个参数,则图片将按提供的高度和宽度规格保存.
#
# 该字段要求 Python Imaging Library.
#
# IntegerField
# 用于保存一个整数.
#
# admin 用一个``<input type="text">``表示该字段保存的数据(一个单行编辑框)
#
# IPAddressField
# 一个字符串形式的 IP 地址, (i.e. "24.124.1.30").
#
# admin 用一个``<input type="text">``表示该字段保存的数据(一个单行编辑框)
#
# NullBooleanField
# 类似 BooleanField, 不过允许 NULL 作为其中一个选项. 推荐使用这个字段而不要用 BooleanField 加 null=True 选项.
#
# admin 用一个选择框 <select> (三个可选择的值: "Unknown", "Yes" 和 "No" ) 来表示这种字段数据.
#
# PhoneNumberField
# 一个带有合法美国风格电话号码校验的 CharField``(格式: ``XXX-XXX-XXXX).
# PositiveIntegerField
# 类似 IntegerField, 但取值范围为非负整数(这个字段应该是允许0值的....所以字段名字取得不太好,无符号整数就对了嘛).
# PositiveSmallIntegerField
# 类似 PositiveIntegerField, 取值范围较小(数据库相关)
# SlugField
# "Slug" 是一个报纸术语. slug 是某个东西的小小标记(短签), 只包含字母,数字,下划线和连字符.它们通常用于URLs.
#
# 若你使用 Django 开发版本,你可以指定 maxlength. 若 maxlength 未指定, Django 会使用默认长度: 50. 在以前的 Django 版本,没有任何办法改变 50 这个长度.
#
# 这暗示了 db_index=True.
#
# 它接受一个额外的参数: prepopulate_from, which is a list of fields from which to auto-populate the slug, via JavaScript, in the object's admin form:
#
# models.SlugField(prepopulate_from=("pre_name", "name"))
# prepopulate_from 不接受 DateTimeFields.
#
# admin 用一个``<input type="text">``表示 SlugField 字段数据(一个单行编辑框)
#
# SmallIntegerField
# 类似 IntegerField, 不过只允许某个取值范围内的整数.(依赖数据库)
#
# TextField
# 一个容量很大的文本字段.
#
# admin 用一个 <textarea> (文本区域)表示该字段数据.(一个多行编辑框).
#
# TimeField
# A time. Accepts the same auto-population options as DateField 和 DateTimeField.
#
# admin 用一个 <input type="text"> 文本框表示该字段保存的数据(附加一些JavaScript shortcuts).
#
# URLField
# 用于保存 URL. 若 verify_exists 参数为 True (默认), 给定的 URL 会预先检查是否存在(即URL是否被有效装入且没有返回404响应).
#
# admin 用一个 <input type="text"> 文本框表示该字段保存的数据(一个单行编辑框)
#
# USStateField
# 一个两字母的美国州名缩写.
#
# admin 用一个 <input type="text"> 文本框表示该字段保存的数据(一个单行编辑框)
#
# XMLField
# 一个校验值是否为合法XML的 TextField,必须提供参数: schema_path, 它是一个用来校验文本的 RelaxNG schema 的文件系统路径.

各种Fields and 参数

我列出了其它的Field,并表明了它们的继承关系:

Field
|--AutoField
|--BooleanField
|--CharField
| |--EmailField
| |--SlugField
| `--URLField
|--DateField
| `--DateTimeField
|--DecimalField
|--FilePathField
|--FloatField
|--IntegerField
| |--BigIntegerField
| |--PositiveIntegerField
| `--PositiveSmallIntegerField
|--IPAddressField
|--GenericIPAddressField
|--NullBooleanField
|--TextField
|--TimeField
`--BinaryField

  

  定义一个类,一个类代表着一张表

class Author(models.Model):  #这里没有定义主键  django会自动生成一个id列 自动增长并且为主键
name=models.CharField(max_length=100)#每个静态字段代表着一列 CharField 必须制定长度
age=models.IntegerField()  

  models.ForeignKey  and ManyToManyField  使用

class BookType(models.Model):
caption=models.CharField(max_length=64) class Book(models.Model):
name=models.CharField(max_length=20)
page=models.IntegerField()
price=models.DecimalField(max_digits=10,decimal_places=2) authors=models.ManyToManyField(Author)
book_type=models.ForeignKey(BookType) # 外键关联的BookType表

  这里要注意的是 Author和 BookType要在Book表之前定义,否则会提示找不到。

  还有另一种方法就是,给 'Author' 和  'BookType' 加上引号,无论是之前还是之后定义都没问题

  ManyToManyField是多对多的关系,ForeignKey是一对多的关系

# 在cmd 下执行 2条命令 生成数据库
python manage.py migrations python manage.py migrate

  执行完毕,可以看到,生成了四张表,

  

  有人可能问道为何创建了三个类,生成了四张表,不是说好的一张表一个类吗

  因为 book_authors是django自动为我们创建的, 多对多的情况下,就会自动生成第三张表,俗称关系表

 

2. 业务和Models结合

定义一个url,再定义一个处理请求的函数

from app01 import views
#我的 处理请求的函数放在views中 urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/$', views.index),
]

  

1.增加数据   

models.Author.objects.create(name='alex',age=30)
models.Author.objects.create(name='eric',age=40)
models.Author.objects.create(name='dalong',age=20) models.BookType.objects.create(caption='历史')
models.BookType.objects.create(caption='政治')
models.BookType.objects.create(caption='文学')
models.BookType.objects.create(caption='计算机')
models.BookType.objects.create(caption='小说')
models.BookType.objects.create(caption='故事') models.Book.objects.create(name='django',pages='80',price='10', book_type_id='5')
models.Book.objects.create(name='tornado',pages='50',price='3', book_type_id='5')
models.Book.objects.create(name='flask',pages='260',price='40',book_type_id='3')
models.Book.objects.create(name='java',pages='1000',price='500', book_type_id='3')
models.Book.objects.create(name='php',pages='2000',price='300', book_type_id='5')
models.Book.objects.create(name='mysql',pages='20',price='10',book_type_id='4')
models.Book.objects.create(name='linux',pages='50',price='100',book_type_id='2')

  

  另一种增加数据的方法

a=Author()  推荐使用上边那种方法

a.name='dalong'

a.age=20

a.save()

  

2.查询数据

#简单查询
a=Author.objects.all() #获取所有数据 print(type(a),a) # a是QuerySet对象 包含所有行 也就是多个Author对象
for line in a: #可迭代出每一行
  print(a.name,a.age) #每一行的元素直接 a.列名获取 a=Author.objects.all().values('name') #指定获取列,可填多个,这里只获取name,结果是以字典形式返回
a=Author.objects.all().values_list('name') #同上 不同的是 结果是以元组形式返回
a=Author.objects.filter(id=1)  #过滤查询 只有符合条件的才会获取到 也是一个QuerySet
a=Author.objects.filter(id=1).first()  #只获取第一个, 是一个Author对象,
a=Author.objects.get(id=1)  #只能获取, 是一个Author对象, 但是如果获取多个就会报错,获取不到也会报错,其他不会 #一对多连表查询 了不起的双下划綫,遇双下划綫就连表查询
a=Book.objects.filter(book_type__caption='jiaoxue').all().values('name','page','book_type__caption')
#正向查询 aa=BookType.objects.filter(caption='计算机').all().values('book__name','book__page','caption')
#反向查询 #多对多连表查询
b=Book.objects.filter(authors__name='dalong').values('name','page','book_type__caption','authors__name')
#正向查询
print(b[:]) #Query set 可以切片
bb=Author.objects.filter(name='dalong').all().values('book__name')
#反向查询
print('2',bb[:]) #正向查询也就是外键或多对多在 自己的类里边, 通过自己去连表查询时就是正向查询
#不管是一对多 还是多对多 正向查询 用外键或多对多 那个键 在这里也就是authors__name 和 book_type__caption
#反向查找 用跟他对应的表加下划线 加键名 book__page book__name

  

3 修改数据

 
 a = Book.objects.get(id=2) #查询一条你要更新的数据
  a.price='66' #赋值给你要更新的字段
  a.save() #保存
  更新多个字段或一个字段
  Book.objects .get(id__gt=4).update(page='321',price='333') #update可多条 本句为id大于4的所有 的价格都改成333
  更新所有字段
  Book.objects.all().update(page='8888') #更新所有字段,更新后会返回受影响的条数

  

4.删除数据

  删除表中全部数据
  Book.objects.all().delete()
  删除一条aa等于'test'的数据
  Book.objects.get(aa='test').delete()
  删除多条数据
  Book.objects.filter(aa='123').delete() #过滤出aa字段等于123的都删除

  

Django之牛逼的Models的更多相关文章

  1. 我喜欢ASP.NET的MVC因为它牛逼的9大理由(转载)

    我很早就关注ASP.NET的mvc的,因为最开始是学了Java的MVC,由于工作的原因一直在做.Net开发,最近的几个新项目我采用了MVC做了,我个一直都非常喜欢.Net的MVC.我们为什么使用MVC ...

  2. 为什么我会认为SAP是世界上最好用最牛逼的ERP系统,没有之一?

    为什么我认为SAP是世界上最好用最牛逼的ERP系统,没有之一?玩过QAD.Tiptop.用友等产品,深深觉得SAP是贵的有道理! 一套好的ERP系统,不仅能够最大程度承接适配企业的管理和业务流程,在技 ...

  3. 最牛逼android上的图表库MpChart(三) 条形图

    最牛逼android上的图表库MpChart三 条形图 BarChart条形图介绍 BarChart条形图实例 BarChart效果 最牛逼android上的图表库MpChart(三) 条形图 最近工 ...

  4. 最牛逼android上的图表库MpChart(二) 折线图

    最牛逼android上的图表库MpChart二 折线图 MpChart折线图介绍 MpChart折线图实例 MpChart效果 最牛逼android上的图表库MpChart(二) 折线图 最近工作中, ...

  5. 最牛逼android上的图表库MpChart(一) 介绍篇

    最牛逼android上的图表库MpChart一 介绍篇 MpChart优点 MpChart是什么 MpChart支持哪些图表 MpChart效果如何 最牛逼android上的图表库MpChart(一) ...

  6. .Net免费公开课视频+资料+源码+经典牛逼 汇总篇【持续更新】

    博主推荐一:WP8.1最经典培训教程 博主点评:经典Windows Phone8.1 Runtime API培训最经典教程,此教程由传智播客蒋坤老师录制的一整套WP8.1入门级视频教程,讲授内容非常广 ...

  7. 科学家有了钱以后,真是挺吓人的——D.E.Shaw的牛逼人生

    科学家有了钱以后,真是挺吓人的——D.E.Shaw的牛逼人生 黑科技,还是要提D.E.Shaw Research这个奇异的存在. 要讲这个黑科技,我们可能要扯远一点,先讲讲D.E. Shaw这个人是怎 ...

  8. cssViewer牛逼的chrome插件

    很牛逼,功能很强大.

  9. NBU是最牛逼的备份软件

    NBU是最牛逼的备份软件 TSM是IBM的备份   好好看看几个厂商 VERITAS 公司下的NBU入门级备份有BEHP的备份软件有DPIBM的是TSMCommvault也非常牛逼这都是做到了小机AI ...

随机推荐

  1. Spark RDD概念学习系列之RDD的转换(十)

    RDD的转换 Spark会根据用户提交的计算逻辑中的RDD的转换和动作来生成RDD之间的依赖关系,同时这个计算链也就生成了逻辑上的DAG.接下来以“Word Count”为例,详细描述这个DAG生成的 ...

  2. 修改hosts文件解决OneDrive被墙的问题

    增加如下内容就可以了.如果不知道修改hosts文件的具体方法请自行百度. 134.170.108.26 onedrive.live.com 134.170.108.152 skyapi.onedriv ...

  3. [置顶] 如何在浏览器中打开PDF文件并实现预览的思路与代码

    编写项目遇到一个需要在浏览器中打开PDF文件的问题.最终实现效果如下: 其实也就是简单的在浏览器中实现一个打开pdf文件,并有类似预览功能的边框. 其实在网上经常见到类似的页面,在浏览器中打开pdf文 ...

  4. How Tomcat Works(九)

    本文接下来描述servlet容器是怎样管理其相关组件的生命周期的,首先本人描述一下事件监听模式,也可以称为观察者模式,该模式分为以下角色 即抽象主题角色 具体主题角色 抽象观察者角色及具体观察者角色, ...

  5. Java中的BASE64

    located in rt.jar... public class sun.misc.BASE64Encoder extends sun.misc.CharacterEncoder{ //.. } p ...

  6. PowerDesigner反向生成Mysql数据原型

    PowerDesigner反向生成Mysql数据原型 注意事项: (1)JVM 要32位的. (2)需配置JAVA_HOME环境变量指向所需JVM. (3)需配置CLASSPATH环境变量执行 MyS ...

  7. Objective-C 学习记录--toches、Motion/Size/Rect/Point/CGFloat/protocol

    - (void)touchesBegan touchesEnd touchesCancelled touchesMoved //代表的是手指在屏幕上的动作,开始 结束 取消 移动 //还有就是代表摇动 ...

  8. Spring中使用Hibernate

    在context中定义DataSource,创建SessionFactoy,设置参数: DAO类继承HibernateDaoSupport,实现具体接口,从中获得HibernateTemplate进行 ...

  9. easymock入门贴

    from:http://macrochen.iteye.com/blog/298032 关于EasyMock常见的几个问题, 这里(http://ozgwei.blogspot.com/2007/06 ...

  10. Libvirt 虚拟化库剖析

    讲到向外扩展计算(比如云计算),libvirt 可能是您从未听说过的最重要的库之一.libvirt 提供一种虚拟机监控程序不可知的 API 来安全管理运行于主机上的来宾操作系统.libvirt 本身不 ...