一、创建数据模型。

实例:

作者模型:一个作者有姓名。

作者详情模型:把作者的详情放到详情表,包含性别、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 - 模型类的定义的更多相关文章

  1. Django进阶Model篇—数据库操作(ORM)

    一.数据库配置 django 默认支持sqlite.mysql.oracle.postgresql数据库,像db2和sqlserver之类的数据库需要第三方的支持,具体详见https://docs.d ...

  2. Django进阶Model篇006 - 多表关联查询

    接着前面的例子,举例多表查询实例如下: 1.查询作战的所有完整信息. >>> AuthorDetail.objects.values('sex','email','address', ...

  3. Django进阶Model篇008 - 使用原生sql

    注意:使用原生sql的方式主要目的是解决一些很复杂的sql不能用ORM的方式写出的问题. 一.extra:结果集修改器-一种提供额外查询参数的机制 二.执行原始sql并返回模型实例 三.直接执行自定义 ...

  4. Django进阶Model篇007 - 聚集查询和分组查询

    接着前面的例子,举例聚集查询和分组查询例子如下: 1.查询人民邮电出版社出了多少本书 >>> Book.objects.filter(publisher__name='人民邮电出版社 ...

  5. Django进阶Model篇005 - QuerySet常用的API

    django.db.models.query.QuerySet QuerySet特点: 1.可迭代 2.可切片 查询相关API 1.get(**kwargs):返回与所给的筛选条件相匹配的对象,返回结 ...

  6. Django进阶Model篇004 - ORM常用操作

    一.增加 create和save方法 实例: 1.增加一条作者记录 >>> from hello.models import * >>> Author.object ...

  7. Django进阶Model篇001 - mysql 数据库的配置

    django 默认支持sqlite.mysql.oracle.postgresql数据库,像db2和sqlserver之类的数据库需要第三方的支持,具体详见: https://docs.djangop ...

  8. Django进阶Template篇002 - 模板包含和继承

    包含 {% include %} 允许在模板中包含其他模板的内容. {% include "foo/bar.html" %} {% include template_name %} ...

  9. Django进阶Model篇003 - 数据库同步技巧

    一.认识一个目录 目录名:migrations 作用:用来存放通过makemigrations命令生成的数据库脚本,不熟悉的情况下,里面生成的脚本不要轻易修改.app目录下必须要有migrations ...

随机推荐

  1. IO流入门-第十三章-File相关

    /* java.io.File 1.File和流无关,不能通过该类完成文件的读写 2.File是文件和目录路径名的抽象变现形式. */ import java.io.*; public class F ...

  2. Java 语言基础(一)

    大多数编程语言都包括以下基本内容: 关键字 标识符 注释 常量和变量 运算符 语句 函数 数组 学习语言最重要的两点: 该语言基础的表现形式是什么 这些东西什么时候使用 关键字 在程序语言中有特殊含义 ...

  3. Web 资源介绍

    软件体系结构 C/S, client/server 特点: 该结构的软件, 客户端和服务端都需要编写 开发成本较高,维护较为麻烦 好处: 客户端在本地可以分担一部分运算 B/S, browser/se ...

  4. SpringMVC是单例的,高并发情况下,如何保证性能的?

    首先在大家的思考中,肯定有影响的,你想想,单例顾名思义:一个个排队过...  高访问量的时候,你能想象服务器的压力了... 而且用户体验也不怎么好,等待太久~ 实质上这种理解是错误的,Java里有个A ...

  5. appium入门基础知识

    1.概念区分: 1)IOS-UIAutomation:随着iOS4.0的发布,苹果公司同时发布了一个名为UIAutomation的测试框架,它可以用来在真实设备和iPhone模拟器上执行自动化测试 学 ...

  6. RT-Thread内核之线程调度(三)

    4.RT-Thread中的线程? /**  * 线程结构  */ struct rt_thread {     /** Object对象 */     char        name[RT_NAME ...

  7. K NEAREST NEIGHBOR 算法(knn)

    K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法, 总体来说KNN算法是相对比较容易理解的算法.其中的K表示最接近自己的K个数据样本.KNN算法和K-M ...

  8. 简述ODS,和数据仓库做简单的比较

    这两天看书,发现了和数据仓库相关的还有一个叫ODS的概念,它是企业级的全局数据库,用于提供集成的,企业级一致的数据,包含如何从各个子系统中向ODS抽取数据以及面向主题的角度存储数据. 它和数据仓库的主 ...

  9. Linux环境配置全局jdk和局部jdk并生效

    全局jdk配置: 1.root用户登录 2.进入opt目录,新建java文件夹 cd  /opt mkdir java  上传jdk7u79linuxx64.tar.gz包到java文件夹并解压 jd ...

  10. 基本运算符与流程控制(Day5)

    一  运算符 1.算数运算 2.比较运算 3.赋值运算 4.逻辑运算 and注解: 在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的一样,但是它们并不返回布尔值:而是,返回它们实际 ...