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. JSF 2 button and commandButton example

    In JSF 2.0, both <h:button /> and <h:commandButton /> tags are used to render HTML input ...

  2. Flipping Parentheses(CSU1542 线段树)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1542 赛后发现这套题是2014东京区域赛的题目,看了排名才发现自己有多low  = =! 题目大意 ...

  3. HDU1712简单的分组背包

    HDU1712http://acm.hdu.edu.cn/showproblem.php?pid=1712 简单的分组背包 #include <map> #include <set& ...

  4. C# 固定窗体大小且不能鼠标调整大小完美实现

    1.先把MaximizeBox和MinimumBox设置为false,这时你发现最大最小化按钮不见了,但是鼠标仍能调整窗体的大小. 2.有人说直接把MaximumSize和MinimumSize设置成 ...

  5. Android 通过ViewFlipper实现广告轮播功能并可以通过手势滑动进行广告切换

    为了实现广告轮播功能,在网上找了很多方法,有的效果很好,但是代码太麻烦,并且大多是用的viewpager,总之不是很满意. 于是看了一下sdk有个控件是ViewFlipper,使用比较方便,于是尝试了 ...

  6. UVa 10004:Bicoloring

    这道题要我们判断所给图是否可以用两种颜色进行染色,即"二染色“.已知所给图一定是强连通图. 分析之: 若图中无回路,则该图是一棵树,一定可以二染色. 若图中有回路,但回路有偶数个节点,仍然可 ...

  7. 自定义滚动控件(Pagecontrol)

    // // MyPageCorol.h // lejiahui // // Created by iOS开发 on 16/4/10. // Copyright © 2016年 zhongmingwuy ...

  8. extjs tablepanel 高度自适应有关问题

    extjs tablepanel 高度自适应问题 项目中为了给客户好点的功能切换体验,想到了用extjs的tabpanel 在页面中用了tabpanel后,高度新打开的tab页的iframe 的高度总 ...

  9. Eclipse和Android Studio中的DDMS使用时什么不同?

    http://www.jb51.net/softjc/454131.html Eclipse和Android Studio中的DDMS使用时什么不同? 相信很多经常开发Android应用的朋友应该都接 ...

  10. vim复制多行<转>

    比如我要复制从第1行到第5行的数据,复制到第9行 光标移到第5行任意位置,输入ma光标移到第1行任意位置,输入y'a(这一定要打这个“'”单引号,否则就进入“INSERT”状态了光标移到需要复制的行, ...