Django进阶Model篇002 - 模型类的定义
一、创建数据模型。
实例:
作者模型:一个作者有姓名。
作者详情模型:把作者的详情放到详情表,包含性别、email 地址和出生日期,作者详情模型与作者模型之间是一对一的关系(OneToOneField)
出版商模型:出版商有名称,地址,所在城市,省,国家,网址。
书籍模型:书籍有书名,出版日期,价格。一本书可能会有多个作者,一个作者也可以写多本书,所以作者与书籍的关系是多对多的关联关系(many-to-many),一本书只应该由一个出版商出版,所以出版商和书籍是一对多的关联关系(one-to-many),也被称作外键[ForeignKey]。
#coding=utf-8
from django.db import models
from django.utils.encoding import python_2_unicode_compatible @python_2_unicode_compatible
class Author(models.Model):
name=models.CharField(max_length=30) def __str__(self):
return self.name class AuthorDetail(models.Model):
sex=models.BooleanField(max_length=1,choices=((0,'男'),(1,'女'),))
email=models.EmailField()
address=models.CharField(max_length=50)
birthday=models.DateField()
author=models.OneToOneField(Author) @python_2_unicode_compatible
class Publisher(models.Model):
name=models.CharField(max_length=30)
address=models.CharField(max_length=50)
city=models.CharField(max_length=60)
state_province=models.CharField(max_length=30)
country=models.CharField(max_length=50)
website=models.URLField() def __str__(self):
return self.name @python_2_unicode_compatible
class Book(models.Model):
title=models.CharField(max_length=100)
authors=models.ManyToManyField(Author)
publisher=models.ForeignKey(Publisher)
publication_date=models.DateField()
price=models.DecimalField(max_digits=5,decimal_places=2,default=10) def __str__(self):
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
***微信扫一扫,关注“python测试开发圈”,了解更多测试教程!***
Django进阶Model篇002 - 模型类的定义的更多相关文章
- Django进阶Model篇—数据库操作(ORM)
一.数据库配置 django 默认支持sqlite.mysql.oracle.postgresql数据库,像db2和sqlserver之类的数据库需要第三方的支持,具体详见https://docs.d ...
- Django进阶Model篇006 - 多表关联查询
接着前面的例子,举例多表查询实例如下: 1.查询作战的所有完整信息. >>> AuthorDetail.objects.values('sex','email','address', ...
- Django进阶Model篇008 - 使用原生sql
注意:使用原生sql的方式主要目的是解决一些很复杂的sql不能用ORM的方式写出的问题. 一.extra:结果集修改器-一种提供额外查询参数的机制 二.执行原始sql并返回模型实例 三.直接执行自定义 ...
- Django进阶Model篇007 - 聚集查询和分组查询
接着前面的例子,举例聚集查询和分组查询例子如下: 1.查询人民邮电出版社出了多少本书 >>> Book.objects.filter(publisher__name='人民邮电出版社 ...
- Django进阶Model篇005 - QuerySet常用的API
django.db.models.query.QuerySet QuerySet特点: 1.可迭代 2.可切片 查询相关API 1.get(**kwargs):返回与所给的筛选条件相匹配的对象,返回结 ...
- Django进阶Model篇004 - ORM常用操作
一.增加 create和save方法 实例: 1.增加一条作者记录 >>> from hello.models import * >>> Author.object ...
- Django进阶Model篇001 - mysql 数据库的配置
django 默认支持sqlite.mysql.oracle.postgresql数据库,像db2和sqlserver之类的数据库需要第三方的支持,具体详见: https://docs.djangop ...
- Django进阶Template篇002 - 模板包含和继承
包含 {% include %} 允许在模板中包含其他模板的内容. {% include "foo/bar.html" %} {% include template_name %} ...
- Django进阶Model篇003 - 数据库同步技巧
一.认识一个目录 目录名:migrations 作用:用来存放通过makemigrations命令生成的数据库脚本,不熟悉的情况下,里面生成的脚本不要轻易修改.app目录下必须要有migrations ...
随机推荐
- 解决URL地址中的中文乱码问题的办法
解决URL地址中的中文乱码问题的办法 引言: 在Restful类的服务设计中,经常会碰到需要在URL地址中使用中文作为的参数的情况,这种情况下,一般都需要正确的设置和编码中文字符信息.乱码问题就此产生 ...
- 01 javaSe 01 抽象类和接口
抽象类 接口 目录(?)[-] 1 抽象类与接口是面向对象思想层面概念不是程序设计语言层面概念 2 抽象类是本体的抽象接口是行为的抽象 3 C中抽象类与接口的探讨 目录(?)[+] ...
- mysql中变量的定义
mysql中的变量定义 mysql的变量分为系统变量和用户变量,mysql系统定义的变量是系统变量,用户自己定义的变量为用户变量.对于系统变量,用户只能够改变它的值不能够创建新的系统变量.对于用户变量 ...
- PHP逐行读取数据
PHP逐行读取数据 <?php $file = fopen("Minot.txt", "r") or exit("Unable to open ...
- java反射基础知识(一)
一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...
- 基本数据类型(Day4)
一 什么是数据? eg:x=10 则10是要存储的数据 二 为什么数据要分不同的类型? 数据是用来表示不同状态的,当然不同的状态可以用不同的数据表示 三 数据类型 1.数字(整型,长整型 ,浮 ...
- 解决hash冲突的办法
1.开发定址法 2.再哈希法 3.链地址法 4.建立一个公共溢出区
- MAC 终端terminal颜色
Mac终端terminal颜色实在太单调了,安装Linux使用的GNU Coreutils替换Mac的ls命令: Mac终端terminal颜色实在太单调了,安装Linux使用的GNU Coreuti ...
- hdu4749 kmp应用
呃,从网上看的题解,然而其实有点地方还没搞懂,先放在这,以后再回来理解. 题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4749 题目:2013 is ...
- javaEE中的字符编码问题
0 web.xml中注册的CharacterEncodingFilter <!-- 配置字符集过滤器 --> <filter> <filter-name>encod ...