基本操作

1、meta类属性汇总

属性名 用法 举例代码
abstract
如果设置abstract=True则这个模式是一个抽象基类  
db_table
定义model在数据库中的表名称,如果不定义,会生成默认’应用名_模型名‘
db_table = 'music_album'
get_latest_by
用于指定默认的排序字段,支持DateField\DateTimeField\IntegerField
get_latest_by =“ORDER_DATE”
managed
True或False,定义django命令行migrate工具是否管理此模型  
order_with_respect_to
根据给定的字段对 model 排序。在关联关系中,它经常用在根据目标对象对源对象排序的场合。举 个例子,一个 Answer 只关联一个 Question 对象,而一个 question 对象却可以关联多 个 answer 对象。根据 question 对 answer 排序,
order_with_respect_to = 'question'
ordering
定义默认的排序列,如果在字段前加"-"表示降序排列,不加则是升序排列。加?随机排列
ordering = ['-pub_date', 'author']
permissions
在创建对象时,添加到权限表当中的附加权限信息。Django 自动为每个设置了 admin 的对象创建了添 加,删除和修改的权限。
permissions = (("can_deliver_pizzas", "Can deliver pizzas"),)或

(permission_code, human_readable_permission_name) 。
default_permissions
默认包含('add','change','delete')  
proxy
如果 proxy = True ,表示该 model 是其父类的代理  
unique_together
用来设置的不重复的字段组合,必须唯一(将两个字段做联合唯一):
unique_together = (("driver", "restaurant"),)
index_together
通过字段名集合创建索引,会根据选项生成合适的CREATE INDEX语句
index_together = ["pub_date", "deadline"]
verbose_name
指定该对象的一个可读性更好的唯一名字(单数):
verbose_name = "pizza"
verbose_name_plural
指定该对象的一个可读性更好的唯一名字(复数):默认是verbose_name+"s"
verbose_name_plural = "stories"

字段名称限制:

一个字段名不能包含连续的一个以上的下划线,因为那是Django查询语句的语法。

2、字段列表纵览表

字段名

参数

意义

AutoField

一个能够根据可用ID自增的 IntegerField

BooleanField

一个真/假(true/false)字段

CharField

(max_length)

一个字符串字段,适用于中小长度的字符串。对于长段的文字,请使用 TextField

CommaSeparatedIntegerField

(max_length)

一个用逗号分隔开的整数字段

DateField

([auto_now], [auto_now_add])

日期字段

DateTimeField

时间日期字段,接受跟 DateField 一样的额外选项

EmailField

一个能检查值是否是有效的电子邮件地址的 CharField

FileField

(upload_to)

一个文件上传字段

FilePathField

(path,[match],[recursive])

一个拥有若干可选项的字段,选项被限定为文件系统中某个目录下的文件名

FloatField

(max_digits,decimal_places)

一个浮点数,对应Python中的 float 实例

ImageField

(upload_to, [height_field] ,[width_field])

像 FileField 一样,只不过要验证上传的对象是一个有效的图片。

IntegerField

一个整数。

IPAddressField

一个IP地址,以字符串格式表示(例如: "24.124.1.30" )。

NullBooleanField

就像一个 BooleanField ,但它支持 None /Null 。

PhoneNumberField

它是一个 CharField ,并且会检查值是否是一个合法的美式电话格式

PositiveIntegerField

和 IntegerField 类似,但必须是正值。

PositiveSmallIntegerField

与 PositiveIntegerField 类似,但只允许小于一定值的值,最大值取决于数据库.

SlugField

嵌条 就是一段内容的简短标签,这段内容只能包含字母、数字、下

划线或连字符。通常用于URL中

SmallIntegerField

和 IntegerField 类似,但是只允许在一个数据库相关的范围内的数值(通常是-32,768到

+32,767)

TextField

一个不限长度的文字字段

TimeField

时分秒的时间显示。它接受的可指定参数与 DateField 和 DateTimeField 相同。

URLField

用来存储URL的字段。

USStateField

美国州名称缩写,两个字母。

XMLField

(schema_path)

它就是一个 TextField ,只不过要检查值是匹配指定schema的合法XML。

3、通用字段参数列表(所有的字段类型都可以使用下面的参数,所有的都是可选的。)

参数名

意义

null

如果设置为 True 的话,Django将在数据库中存储空值为 NULL 。默认为 False 。

blank

如果是 True ,该字段允许留空,默认为 False 。

choices

一个包含双元素元组的可迭代的对象,用于给字段提供选项。

db_column

当前字段在数据库中对应的列的名字。

db_index

如果为 True ,Django会在创建表格(比如运行 manage.py syncdb )时对这一列创建数据库索引。

default

字段的默认值

editable

如果为 False ,这个字段在管理界面或表单里将不能编辑。默认为 True 。

help_text

在管理界面表单对象里显示在字段下面的额外帮助文本。

primary_key

如果为 True ,这个字段就会成为模型的主键。

radio_admin

默认地,对于 ForeignKey 或者拥有 choices 设置的字段,Django管理界面会使用列表选择框(<select>)。如果 radio_admin 设置为 True 的话,Django就会使用单选按钮界面。

unique

如果是 True ,这个字段的值在整个表中必须是唯一的。

unique_for_date

把它的值设成一个 DataField 或者 DateTimeField 的字段的名称,可以确保字段在这个日期内不会出现重复值。

unique_for_month

和 unique_for_date 类似,只是要求字段在指定字段的月份内唯一。

unique_for_year

和 unique_for_date 及 unique_for_month 类似,只是时间范围变成了一年。

verbose_name

除 ForeignKey 、 ManyToManyField 和 OneToOneField 之外的字段都接受一个详细名称作为第一个位置参数。

4、django字段查询谓词表

django两种过滤器

  • filter:返回符合条件的数据集
  • exclude:返回不符合条件的数据集

查询条件用:双下划线链接的字段名称和谓词来表达查询条件

谓词 含义 实例 等价SQL语句
exact 精确等于 Entry.objects.get(id__exact=14) SELECT ... WHERE id = 14
iecact 大小写不敏感的等于 Entry.objects.get(headlin__exact='I like this') SELECT....WHERE upper(headline) = 'I LIKE THIS'
 contains 模糊匹配 Entry.objects.get(headline__contains='Lennon') SELECT ... WHERE headline LIKE '%Lennon%';
 in 在列表中查找 Entry.objects.filter(id__in=[1, 3, 4]) SELECT ... WHERE id IN (1, 3, 4);
gt gte lt lte  比较大小等于 Entry.objects.filter(id__gt=4) SELECT ... WHERE id > 4;
startswith 以...开始查找 Entry.objects.filter(headline__startswith='Will') SELECT ... WHERE headline LIKE 'Will%';
endswith 以...结尾查找 Entry.objects.filter(headline__endswith='cats') SELECT ... WHERE headline LIKE '%cats';
range 范围查找 start_date = datetime.date(2005, 1, 1)
end_date = datetime.date(2005, 3, 31)
Entry.objects.filter(pub_date__range=(start_date, end_date))
SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';
year month  day 按年 月 日 查找 Entry.objects.filter(pub_date__year=2005) SELECT ... WHERE pub_date BETWEEN '2005-01-01' AND '2005-12-31 23:59:59.999999';
week_day  按星期几查找 Entry.objects.filter(pub_date__week_day=2)  
 isnull 是否为空查找 Entry.objects.filter(pub_date__isnull=True) SELECT ... WHERE pub_date IS NULL;

Django还提供了get()用于查询单条记录   comment.objects.get(id__exact = 1)

Django还支持查询指定条数的数据集

comment.objects.all()[:10]

comment.objects.all()[10:20]

comment.objects.all()[1]

还支持order_by操作

comment.objects.order_by('headline')

5、数据保存与删除

DJango定义了一个统一的save方法,完成模型的insert和update操作,执行save函数,自动判断记录是否存在,存在则更新,否则删除

删除操作  comment.objects.get(id__exact = 1)。delete()

6、关系操作

 一对一关系 OneToOneField

from django.db import models

class Account(models.Model):
username = models.CharField(max_length=80)
password = models.CharField(max_length=225)
ref_date = models.DateField() def __unicode__(self):
return 'Account: %s' % self.username class Contact(models.Model):
account = models.OneToOneField(
Account, # 被关联的模型名
on_delete=models.CASCADE,# 当被关联模型记录被删除时,本记录也会被删除
primary_key=True,
)
zip_code = models.CharField(max_length=10)
address = models.CharField(max_length=80)
mobile = models.CharField(max_length=20) def __unicode__(self): # 定义模型的显示字符串
return '%s ,%s' % (self.account.username,self.mobile)

一对多关系 ForeignKey

from django.db import models

class Account(models.Model):
username = models.CharField(max_length=80)
password = models.CharField(max_length=225)
ref_date = models.DateField() def __unicode__(self):
return 'Account: %s' % self.username class Contact(models.Model):
account = models.ForeignKey(
Account, # 被关联的模型名
on_delete=models.CASCADE,# 当被关联模型记录被删除时,本记录也会被删除
)
zip_code = models.CharField(max_length=10)
address = models.CharField(max_length=80)
mobile = models.CharField(max_length=20) def __unicode__(self): # 定义模型的显示字符串
return '%s ,%s' % (self.account.username,self.mobile)
print(a.contact_set) # 从主对象中找到附对象

[<Contact:Rose,13145671234>,<Contact:Rose,13178654234>]

在一对多关系中,每个模型可以关联多个子对象,所以本例从主模型Account对象中寻找附模型Contact的属性时contact_set,通过一个集合返回关联结果

注:xxx_set时Django设定的通过主模型对象访问附模型对象集合的属性名,相当于flask中的backref属性

多对多关系 ManyToMany

from django.db import models

class Account(models.Model):
username = models.CharField(max_length=80)
password = models.CharField(max_length=225)
ref_date = models.DateField() def __unicode__(self):
return 'Account: %s' % self.username class Contact(models.Model):
accounts = models.ManyToManyField(
Account, # 被关联的模型名
)
zip_code = models.CharField(max_length=10)
address = models.CharField(max_length=80)
mobile = models.CharField(max_length=20) def __unicode__(self): # 定义模型的显示字符串
return '%s ,%s' % (self.accounts.username,self.mobile)

演示

#分别建立和保存Account和Contact对象
>>a1 = Account(user_name = 'Leon')
>>a1.save()
>>c1 = Contact(mobile = '')
>>c1.save() >>c1.accounts.add(a1) # 通过Contact对象建立关系 >>a2= Account(user_name = 'Terry')
>>a2.save()
>>a2.contact_set.add(c1) # 通过Account对象建立关系 >>a1.contact_set.remove(c1) # 取消单个对象关联
>>a1.contact_set.clear() # 取消a1与所有其他Contact对象的关联

7、面向对象ORM

抽象类继承

抽象类的作用是在多个表由若干相同的字段时,可以将这些字段统一定义在抽象基类中,免于重复定义这些字段,抽象基类通过模型的meta中定义abstract = True来实现

from django.db import models

# Create your models here.

class MessageBase(models.Model):
id = models.AutoField()
username = models.CharField(max_length=80)
content = models.CharField(max_length=225)
pub_date = models.DateField() class Meta:
abstract=True # 定义本类为抽象基类 KIND_CHOICES = (
('python技术','python技术'),
('数据库技术','数据库技术'),
('经济学','经济学'),
('文体资讯','文体资讯'),
('个人心情','个人心情'),
('其他','其他'),
) class Moment(MessageBase): #继承抽象类
kind = models.CharField(max_length=20,choices=KIND_CHOICES,default=KIND_CHOICES[0]) class Comment(MessageBase):
headline = models.CharField(max_length=50)

子类模型的编程中可以直接引用父类定义的字段,以上会生成2个表

多表继承-无需特殊关键字

from django.db import models

# Create your models here.

class MessageBase(models.Model):
id = models.AutoField()
username = models.CharField(max_length=80)
content = models.CharField(max_length=225)
pub_date = models.DateField() KIND_CHOICES = (
('python技术','python技术'),
('数据库技术','数据库技术'),
('经济学','经济学'),
('文体资讯','文体资讯'),
('个人心情','个人心情'),
('其他','其他'),
) class Moment(MessageBase):
kind = models.CharField(max_length=20,choices=KIND_CHOICES,default=KIND_CHOICES[0]) class Comment(MessageBase):
headline = models.CharField(max_length=50)

以上会生成3个表,但是编程中,django内部自动实现父模型和子模型之间一对一关系来实现多表继承技术

# 新建Comment对象,直接在子类中引用父类字段
>>m1 = Comment(username = 'join',headline = 'hello')
>>m1.content = 'hahahahah'
>>m1.save() # 通过父类实例引用父类字段
>> print(m1.messagebase.content)# 多表继承中通过小写的父类名字就可以引用父类实例
hahahahah

代理模型继承

前两种继承模型中子类模型都有实际存储的作用,而代理模型继承中子类只用于管理父类数据,而不实际存储数据,代理模型继承需要通过子类的Meta中定义的proxy = True属性来实现

from django.db import models

class Moment(models.Model):
id = models.AutoField()
username = models.CharField(max_length=80)
content = models.CharField(max_length=225)
pub_date = models.DateField() class OrderdMoment(Moment):
class Meta:
proxy = True
ordering =['-pub_date']

使用代理继承的原因时:子类中新的特性不影响父类模型及其已有代码的行为

Django 模型层的更多相关文章

  1. django 模型层(2)

    Django 模型层(2) 多表操作---模型之间的关系 1 一对一:作者----作者详细信息 2 一对多:书籍----出版社 3 多对多:书籍----作者 一  创建模型(主键(id)自动创建) 没 ...

  2. Django模型层(2)

    <!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8&quo ...

  3. {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询

    Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...

  4. Django模型层之ORM

    Django模型层之ORM操作 一 ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数据库管理软 ...

  5. Django模型层之单表操作

    Django模型层之单表操作 一 .ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数据库管理软 ...

  6. Django模型层之更多操作

    Django模型层之更多操作 一 .ORM字段 1.1 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为 ...

  7. Django模型层(各种表及表数据的操作)

    目录 一.Django模型层 0. django模型层的级联关系 1. 配置django测试脚本 (1)方式一 (2)方式二 2. orm表数据的两种增删改 (1)方式一: (2)方式二: 3. pk ...

  8. day 70 Django基础五之django模型层(二)多表操作

    Django基础五之django模型层(二)多表操作   本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ...

  9. day 69 Django基础五之django模型层(一)单表操作

    Django基础五之django模型层(一)单表操作   本节目录 一 ORM简介 二 单表操作 三 章节作业 四 xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现 ...

  10. day 57 Django基础五之django模型层之关联管理器

    Django基础五之django模型层之关联管理器   class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况 ...

随机推荐

  1. LVS-NAT模式的配置详解

    由于实验室拟态存储的项目需要通过NAT模式来映射NFS服务器已实现负载均衡的目的,通过调研了多种负载均衡机制,笔者最终选择了LVS的NAT模式来实现需求,接下来通过博客来记录一下LVS-NAT模式的配 ...

  2. Ambari大数据的管理利器

    概述 一个完全开源的管理平台,用于供应,管理,监控和保护Apache Hadoop集群.Apache Ambari客户管理和操作Hadoop集群 Apache Ambari作为Hortonworks数 ...

  3. php seaslog的使用

    今天有幸在慕课网看到了 关于php日志处理工具  seasLog 的使用视频,本着好奇看完了该视频,觉得不错,便自己也倒腾了下,现在整理出来 seaslog github: https://githu ...

  4. bzoj3142 luogu3228 HNOI2013 数列

    这题好没意思啊,怀疑拉不开区分度. 题意:求一个递增序列,每两个相邻数字之间的差值不超过m,最后一个值不能大于n. 分析:网上好多人用了差分,我没想到.然后YY了一发生成函数. 考虑构造生成函数G(x ...

  5. WordPress文章页添加展开/收缩功能

    很多时候我们在WordPress上发布一些文章的时候里面都包含了很多的代码,我一般又不喜欢把代码压缩起来而喜欢让代码格式化显示,但是格式化显示通常会让文章内容看起来很多,不便于访问者浏览,所以今天就介 ...

  6. Servlet的监听器

    Listener是Servlet的监听器,它可以监听客户端的请求.服务端的操作等.通过监听器,可以自动激发一些操作,比如监听在线的用户的数量.当增加一个HttpSession时,就激发sessionC ...

  7. 新手立体四子棋AI教程(1)——基础扫盲

    一.引言 最近身边好几个朋友开始玩立体四子棋,激起了我的好奇心.那么首先来说什么是[立体四子棋],规则又是如何呢? 上图即为立体四子棋,规则类似于五子棋四子连在一起,但是四子棋更加多样.丰富.不仅可以 ...

  8. jar包和war包的介绍与区别

    在学习maven的过程中接触到了jar包和war包.之前在写小项目的时候真的遇到过war包,当时为了找到jar包,把war包 的后缀名改成了.rar的压缩文件,在里面提取出来jar包来用.其实jar包 ...

  9. spring 文件模板下载多种实现方式

    针对于文件的下载,我们有很多种实现方式.业务场景是这样子的,要实现Excel文件的导入和导出功能,问题对于java的POI操作没有问题,所以实现文件的下载就相对简单,只需要从数据库取出相关的数据,针对 ...

  10. 【Django】 rest-framework和RestfulAPI的设计

    [rest-framework] 这是一个基于django才能发挥作用的组件,专门用于构造API的. 说到API,之前在其他项目中我也做过一些小API,不过那些都是玩票性质,结构十分简单而且要求的设计 ...