Django中ORM模型总结(二)[模型类的对应关系,模型类的属性,字段类型]
2017-08-04 12:07
881 查看
模型类的对应关系
多对多
创建模型类----->新闻类型类
创建模型类----->新闻内容类
总结:
建立多对多的语句写在哪一行都可以
生成第三张表的表名为:(模型类名小写_关联属性名)
建立的语句写在了哪个模型类当中,决定生成第三张表名的名字
模型类名小写为:建立语句所在的模型类的类名的小写
一对多
总结(一)当中图书和英雄的案例则为一对多的关系
创建语句写在多的模型类当中
总结:
创建表后关联字段名称为----关联属性_id
一对一
总结:
创建语句写在哪一个模型类当中都可以
自关联
描述:
自关联是一种特殊的一对多的关系。
例:显示广州市的上级地区和下级地区。
地区表:id, title, parent
导入数据信息
注意:导入数据时需要从areas.sql的当前所在文件夹进入数据库
mysql终端中批量执行sql语句:
案例:
模型管理器:
BookInfo.objects.all()->objects是一个什么东西呢?
答:objects是Django帮我自动生成的管理器,通过这个管理器可以实现对数据的查询。
objects是models.Manger类的一个对象。自定义管理器之后Django不再帮我们生成默认的objects管理器。
自定义模型管理器:
自定义一个管理器类,这个类继承models.Manger类。
再在具体的模型
4000
类里定义一个自定义管理器类的对象
自定义管理器类的应用场景:
改变查询的结果集。比如调用BookInfo.books.all()返回的是没有删除的图书的数据。
添加额外的方法。如下:
管理器类中定义一个方法帮我们创建对应的模型类对象。
使用self.model()就可以创建一个跟自定义管理器对应的模型类对象。
例:
自定义模型管理器的好处
可以更改父类的方法
根据自己的需求定义额外的对表的一些操作
元选项
django默认生成的表名为 应用的名字_模型类的类名可以通过元选项的操作给表指定表名
需要在模型类中定义一个元类Meta,在里面定义一个类属性db_table就可以指定表名。
例:
查询集:
查询集表示从数据库中获取的对象集合,在管理器上调用某些过滤器方法会返回查询集,
查询集可以含有零个、一个或多个过滤器。过滤器基于所给的参数限制查询的结果,从Sql的角度,
查询集和select语句等价,过滤器像where和limit子句。
返回查询集的过滤器如下:
all(): 返回所有数据。
filter(): 返回满足条件的数据。
exclude(): 返回满足条件之外的数据,相当于sql语句中where部分的not关键字。
order_by(): 对结果进行排序。
返回单个值的过滤器如下:
get():返回单个满足条件的对象
如果未找到会引发"模型类.DoesNotExist"异常。
如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常。
count():返回当前查询的总条数
aggregate():聚合
查询集的两大特性:
惰性执行:创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用。
缓存:查询集的结果被存下来之后,再次查询时会使用之前缓存的数据。
限制查询集:
可以通过下标的方式对一个查询集进行切片操作---从而达到限制查询集的的结果
模型类属性
属性命名限制:
不能是python的保留关键字。
不允许使用连续的下划线,这是由django的查询方式决定的,在第4节会详细讲解查询。
定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:
格式:
AutoField:自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。
BooleanField:布尔字段,值为True或False。
NullBooleanField:支持Null、True、False三种值。
CharField(max_length=字符长度):字符串。TextField:大文本字段,一般超过4000个字符时使用。
参数max_length表示最大字符个数。
IntegerField:整数。
DecimalField(max_digits=None, decimal_places=None):十进制浮点数。FloatField:浮点数。
参数max_digits表示总位数。
参数decimal_places表示小数位数。
DateField[auto_now=False, auto_now_add=False]):日期。TimeField:时间,参数同DateField。
参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。
参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。
参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。
DateTimeField:日期时间,参数同DateField。
FileField:上传文件字段。
ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片。
选项:
null:如果为True,表示允许为空,默认值是False。
blank:如果为True,则该字段允许为空白,默认值是False。
对比:null是数据库范畴的概念,blank是表单验证证范畴的。
db_column:字段的名称,如果未指定,则使用属性的名称。
db_index:若值为True, 则在表中会为此字段创建索引,默认值是False。
default:默认值。
primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用。
unique:如果为True, 这个字段在表中必须有唯一值,默认值是False。
多对多
创建模型类----->新闻类型类
class TypeInfo(models.Model): """创建新闻模型类""" tname = models.CharField(max_length=20)
创建模型类----->新闻内容类
class NewInfo(models.Model): """闯将新闻内容类""" ntitle = models.CharField(max_length=20) npub_date = models.DateTimeField(auto_now_add=True) ncontent = models.FileField() # 建立多对多的关系 ntype = models.ManyToManyField("TypeInfo")
总结:
建立多对多的语句写在哪一行都可以
生成第三张表的表名为:(模型类名小写_关联属性名)
建立的语句写在了哪个模型类当中,决定生成第三张表名的名字
模型类名小写为:建立语句所在的模型类的类名的小写
一对多
总结(一)当中图书和英雄的案例则为一对多的关系
创建语句写在多的模型类当中
hbook = models.ForeignKey("BookInfo")
总结:
创建表后关联字段名称为----关联属性_id
一对一
class Student(models.Model): """建立学生基本信息模型类""" sname = models.CharField(max_length=20) sage = models.IntegerField()
class StuInfo(models.Model): """简历学生的详细信息类一对一的关系""" scontent = models.CharField(max_length=200) stu = models.OneToOneField("Student")
总结:
创建语句写在哪一个模型类当中都可以
自关联
描述:
自关联是一种特殊的一对多的关系。
例:显示广州市的上级地区和下级地区。
地区表:id, title, parent
class AreaInfo(models.Model): """创建地区模型类""" atitle = models.CharField(max_length=20) aparent = models.ForeignKey("self", null=True, blank=True)
导入数据信息
注意:导入数据时需要从areas.sql的当前所在文件夹进入数据库
mysql终端中批量执行sql语句:
source areas.sql;
案例:
def area(request): """地区示例""" # 1.获取当前那的地区 # 2.id为440100的市为哪个省的 # 3.id为440100的市里面有那些区 area = AreaInfo.objects.get(id=440100) 方法一: parent = area.aparent children = area.areainfo_set.all() 方法二: parent = AreaInfo.objects.filter(areainfo__id=440100) children = AreaInfo.objects.filter(aparent__id=440100) return render(request, "booktest/area.html", {"area": area, "parent": parent, "children": children})
模型管理器:
BookInfo.objects.all()->objects是一个什么东西呢?
答:objects是Django帮我自动生成的管理器,通过这个管理器可以实现对数据的查询。
objects是models.Manger类的一个对象。自定义管理器之后Django不再帮我们生成默认的objects管理器。
自定义模型管理器:
自定义一个管理器类,这个类继承models.Manger类。
再在具体的模型
4000
类里定义一个自定义管理器类的对象
自定义管理器类的应用场景:
改变查询的结果集。比如调用BookInfo.books.all()返回的是没有删除的图书的数据。
添加额外的方法。如下:
管理器类中定义一个方法帮我们创建对应的模型类对象。
使用self.model()就可以创建一个跟自定义管理器对应的模型类对象。
例:
class BookInfoManage(models.Manager): """继承模型管理器类""" def all(self): # 调用父类的__init__方法1(python2) # Cat.__init__(self,name) # 调用父类的__init__方法2 # super(Bosi,self).__init__(name) # 调用父类的__init__方法3---->此方法为python3的方法 # super().__init__(name) # books = models.Manager.all(self) # books = super(models.Manager, self).all() # books = super().all(self) books = super(models.Manager, self).all() books = books.filter(isDelete=0) return books def create_book(self, btitle, bpub_date): """自定义添加数据的方法""" b = BookInfo() # 方法二:此方法的优点,当模型的类名修改时不需要随之修改名字 # b = self.model() b.btitle = btitle b.bpub_date = bpub_date b.bread = 0 b.bcomment = 0 b.save()
自定义模型管理器的好处
可以更改父类的方法
根据自己的需求定义额外的对表的一些操作
元选项
django默认生成的表名为 应用的名字_模型类的类名可以通过元选项的操作给表指定表名
需要在模型类中定义一个元类Meta,在里面定义一个类属性db_table就可以指定表名。
例:
class Meta(): """自定一表名""" db_table = "bookinfo" # 注意是定义在模型类的里面
查询集:
查询集表示从数据库中获取的对象集合,在管理器上调用某些过滤器方法会返回查询集,
查询集可以含有零个、一个或多个过滤器。过滤器基于所给的参数限制查询的结果,从Sql的角度,
查询集和select语句等价,过滤器像where和limit子句。
返回查询集的过滤器如下:
all(): 返回所有数据。
filter(): 返回满足条件的数据。
exclude(): 返回满足条件之外的数据,相当于sql语句中where部分的not关键字。
order_by(): 对结果进行排序。
返回单个值的过滤器如下:
get():返回单个满足条件的对象
如果未找到会引发"模型类.DoesNotExist"异常。
如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常。
count():返回当前查询的总条数
aggregate():聚合
查询集的两大特性:
惰性执行:创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用。
缓存:查询集的结果被存下来之后,再次查询时会使用之前缓存的数据。
限制查询集:
可以通过下标的方式对一个查询集进行切片操作---从而达到限制查询集的的结果
模型类属性
属性命名限制:
不能是python的保留关键字。
不允许使用连续的下划线,这是由django的查询方式决定的,在第4节会详细讲解查询。
定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:
格式:
属性=models.字段类型(选项)[/code]
字段类型
使用时需要引入django.db.models包,字段类型如下:AutoField:自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。
BooleanField:布尔字段,值为True或False。
NullBooleanField:支持Null、True、False三种值。
CharField(max_length=字符长度):字符串。TextField:大文本字段,一般超过4000个字符时使用。
参数max_length表示最大字符个数。
IntegerField:整数。
DecimalField(max_digits=None, decimal_places=None):十进制浮点数。FloatField:浮点数。
参数max_digits表示总位数。
参数decimal_places表示小数位数。
DateField[auto_now=False, auto_now_add=False]):日期。TimeField:时间,参数同DateField。
参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。
参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。
参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。
DateTimeField:日期时间,参数同DateField。
FileField:上传文件字段。
ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片。
选项:
null:如果为True,表示允许为空,默认值是False。
blank:如果为True,则该字段允许为空白,默认值是False。
对比:null是数据库范畴的概念,blank是表单验证证范畴的。
db_column:字段的名称,如果未指定,则使用属性的名称。
db_index:若值为True, 则在表中会为此字段创建索引,默认值是False。
default:默认值。
primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用。
unique:如果为True, 这个字段在表中必须有唯一值,默认值是False。
相关文章推荐
- Django模型属性和MySQL数据库数据类型对应关系
- Django 模型字段类型总结 (Django Model field types summary)
- django模型的字段类型和关系
- Django模型系统——ORM表结构对应关系
- MySQL数据类型和常用字段属性总结
- MySQL数据类型和常用字段属性总结
- Django 模型与 Mysql 数据类型对应
- python-django 模型model字段类型说明
- django官方文档——模型字段关系参考
- thinkphp的M方法可以直接使用模型类进行查询,而模型类名字要与数据表对应,模型类中字段不需要写
- MySQL数据类型和常用字段属性总结
- django的Model 模型中常用的字段类型
- java.sql.Types,数据库字段类型,java数据类型的对应关系
- Django的ORM数据模型的反向关系
- java.sql.Types,数据库字段类型,java数据类型的对应关系
- SQL字段类型与Java类的对应关系
- 小技巧--高效编写IBATIS配置文件中的属性与字段对应映射关系
- MySQL数据类型和常用字段属性总结
- 原 hibernate与mysql字段类型对应关系
- MySQL数据类型和常用字段属性总结