Django进阶Model篇002 - 模型类的定义
2017-02-25 13:08
218 查看
一、创建数据模型。
实例:
作者模型:一个作者有姓名。
作者详情模型:把作者的详情放到详情表,包含性别、email 地址和出生日期,作者详情模型与作者模型之间是一对一的关系(OneToOneField)
出版商模型:出版商有名称,地址,所在城市,省,国家,网址。
书籍模型:书籍有书名,出版日期,价格。一本书可能会有多个作者,一个作者也可以写多本书,所以作者与书籍的关系是多对多的关联关系(many-to-many),一本书只应该由一个出版商出版,所以出版商和书籍是一对多的关联关系(one-to-many),也被称作外键[ForeignKey]。
一起来看看上面的代码:
1、每个数据模型都是 django.db.models.Model 的子类。它的父类 Model 包含了所有必要的和数据库交互的方法,并提供了一个简洁漂亮的定义数据库字段的语法。
2、每个模型相当于单个数据库表(这条规则的例外情况是多对多关系,多对多关系的时候会多生成一张关系表),每个属性也是这个表中的一个字段。属性名就是字段名,它的类型(例如CharField)相当于数据库的字段类型(例如varchar)。
3、模型之间的三种关系:一对一(OneToOneField),一对多(ForeignKey)和多对多(ManyToManyField)
4、模型的常用字段类型
BooleanField: 布尔类型字段
CharField: 字符串类型字段
DateField: 日期字段
DateTimeField:日期时间字段
DecimalField:(精确)小数字段
EmailField:Email字段
FileField:文件字段
FloatField:(浮点数)小数字段
ImageField:图片字段
IntegerField:整数字段
IPAddressField:IP字段
SmallIntegerField:小整数字段
TextField:文本字段
URLField:网址地址字段
...
5、模型常用的字段选项
null(null=True|False) : 数据库字段的设置是否可以为空(数据库进行验证)
blank(blank=True|False):字段是否为空django会进行校验(表单进行验证)
choices 轻量级的配置字段可选属性的定义
default 字段的默认值
help_text 字段文字帮助
primary_key (=True|False) 一般情况不需要进行定义是否为主键,没有显示指明主键,django会自动增加一个默认主键:id=models.AutoField(primary_key=True)
unique 是否唯一,对于数据库表而言。
verbose_name 字段的详细名称,如果不指定该属性,默认使用字段的属性名称。
...
更多详见:https://docs.djangoproject.com/en/1.10/ref/models/fields/
二、定义数据模型的扩展属性
通过内部类Meta给数据模型类增加扩展属性:
class Meta:
verbose_name='名称'
verbose_name_plural='名称复数形式'
ordering=['排序字段']
更多详见:https://docs.djangoproject.com/en/1.10/ref/models/options/
三、定义模型的方法
定义模型方法和普通python类方法没有太大差别,定义模型方法可以将当前对应的数据,组装成具体的业务逻辑。
示例:定义__unicode__() 让对象有个默认的名字
注意:python2里面用__unicode__(),python3里面用__str__()
def __str__(self):
return self.name
实例:
作者模型:一个作者有姓名。
作者详情模型:把作者的详情放到详情表,包含性别、email 地址和出生日期,作者详情模型与作者模型之间是一对一的关系(OneToOneField)
出版商模型:出版商有名称,地址,所在城市,省,国家,网址。
书籍模型:书籍有书名,出版日期,价格。一本书可能会有多个作者,一个作者也可以写多本书,所以作者与书籍的关系是多对多的关联关系(many-to-many),一本书只应该由一个出版商出版,所以出版商和书籍是一对多的关联关系(one-to-many),也被称作外键[ForeignKey]。
1 #coding=utf-8 2 from django.db import models 3 from django.utils.encoding import python_2_unicode_compatible 4 5 @python_2_unicode_compatible 6 class Author(models.Model): 7 name=models.CharField(max_length=30) 8 9 def __str__(self): 10 return self.name 11 12 class AuthorDetail(models.Model): 13 sex=models.BooleanField(max_length=1,choices=((0,'男'),(1,'女'),)) 14 email=models.EmailField() 15 address=models.CharField(max_length=50) 16 birthday=models.DateField() 17 author=models.OneToOneField(Author) 18 19 @python_2_unicode_compatible 20 class Publisher(models.Model): 21 name=models.CharField(max_length=30) 22 address=models.CharField(max_length=50) 23 city=models.CharField(max_length=60) 24 state_province=models.CharField(max_length=30) 25 country=models.CharField(max_length=50) 26 website=models.URLField() 27 28 def __str__(self): 29 return self.name 30 31 @python_2_unicode_compatible 32 class Book(models.Model): 33 title=models.CharField(max_length=100) 34 authors=models.ManyToManyField(Author) 35 publisher=models.ForeignKey(Publisher) 36 publication_date=models.DateField() 37 price=models.DecimalField(max_digits=5,decimal_places=2,default=10) 38 39 def __str__(self): 40 return self.title
一起来看看上面的代码:
1、每个数据模型都是 django.db.models.Model 的子类。它的父类 Model 包含了所有必要的和数据库交互的方法,并提供了一个简洁漂亮的定义数据库字段的语法。
2、每个模型相当于单个数据库表(这条规则的例外情况是多对多关系,多对多关系的时候会多生成一张关系表),每个属性也是这个表中的一个字段。属性名就是字段名,它的类型(例如CharField)相当于数据库的字段类型(例如varchar)。
3、模型之间的三种关系:一对一(OneToOneField),一对多(ForeignKey)和多对多(ManyToManyField)
4、模型的常用字段类型
BooleanField: 布尔类型字段
CharField: 字符串类型字段
DateField: 日期字段
DateTimeField:日期时间字段
DecimalField:(精确)小数字段
EmailField:Email字段
FileField:文件字段
FloatField:(浮点数)小数字段
ImageField:图片字段
IntegerField:整数字段
IPAddressField:IP字段
SmallIntegerField:小整数字段
TextField:文本字段
URLField:网址地址字段
...
5、模型常用的字段选项
null(null=True|False) : 数据库字段的设置是否可以为空(数据库进行验证)
blank(blank=True|False):字段是否为空django会进行校验(表单进行验证)
choices 轻量级的配置字段可选属性的定义
default 字段的默认值
help_text 字段文字帮助
primary_key (=True|False) 一般情况不需要进行定义是否为主键,没有显示指明主键,django会自动增加一个默认主键:id=models.AutoField(primary_key=True)
unique 是否唯一,对于数据库表而言。
verbose_name 字段的详细名称,如果不指定该属性,默认使用字段的属性名称。
...
更多详见:https://docs.djangoproject.com/en/1.10/ref/models/fields/
二、定义数据模型的扩展属性
通过内部类Meta给数据模型类增加扩展属性:
class Meta:
verbose_name='名称'
verbose_name_plural='名称复数形式'
ordering=['排序字段']
更多详见:https://docs.djangoproject.com/en/1.10/ref/models/options/
三、定义模型的方法
定义模型方法和普通python类方法没有太大差别,定义模型方法可以将当前对应的数据,组装成具体的业务逻辑。
示例:定义__unicode__() 让对象有个默认的名字
注意:python2里面用__unicode__(),python3里面用__str__()
def __str__(self):
return self.name
相关文章推荐
- Django定义模型类常用的属性
- Django进阶Model篇005 - QuerySet常用的API
- Django进阶Model篇003 - 数据库同步技巧
- Django进阶Model篇004 - ORM常用操作
- Django进阶Model篇006 - 多表关联查询
- 7.Django模型类的定义和管理
- Django进阶Model篇007 - 聚集查询和分组查询
- Django进阶Template篇002 - 模板包含和继承
- Django进阶Model篇—数据库操作(ORM)
- Django进阶Model篇008 - 使用原生sql
- Django进阶Model篇001 - mysql 数据库的配置
- Django进阶之session
- Python Django进阶教程(二)(模版过滤器,标签)
- Django中的数据库模型类-models.py(一对一的关系)
- Django框架学习-Model进阶用法
- Django中提示render_to_response未定义的错误
- (7)Django框架学习-Views,URLconf的进阶用法篇
- Activiti进阶(三)——流程定义的CRUD
- Django进阶Admin篇 - admin基本配置
- django models 模型 从入门到进阶