django下model.py模型的定义

一、创建数据模型
实例:
我们来假定下面这些概念、字段和关系:
作者模型:一个作者的姓名
作者详情模型:把作者的详情放到详情表,包含性别、mail地址和出生日期,作者详情模型和作者模型之间是一对一的关系(OneToOneField)
出版商模型:出版商的名称、地址,所在城市、省、国家、网站
书籍模型:书籍有书名和出版日期。一本书可能有多个作者,一个作者也可以写多本书,所以作者和书籍的关系是多对多的关联关系[many-to-many],一本书只应该由一个出版商出版,一个出版商可以出版多本书,所以出版商和书籍是一对多的关系[one-to-many],也被称作外键[ForeignKey]

一起看上面的代码:
1、每个数据模型都是 django.db.models.Model的子类
它的父类Model包含了所有必要的和数据交互的方法,并提供了一个简洁漂亮的定义数据库字段的语法

2、每个模型相当于单个数据库表(这条规则的例外情况是多对多关系,多对多关系的时候会生成一张关系表),每个属性也是这个表中的一个字段。属性名就是字段名,它的类型(例如CharField)相当于数据库的字段类型(例如varchar)。我们可以留意其他的类型和书库里面的什么字段类型对应
3、模型之间的三种关系:一对一(OneToOneField),一对多(ForeignKey)和多对多(ManyToManyField)

models.py
from django.db import models

class Publisher(models.Model):
name = models.CharField(max_length=30, verbose_name="名称")
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()

class Meta:
verbose_name = ‘出版商‘
verbose_name_plural = verbose_name

def __str__(self):
return self.name

class Author(models.Model):
name = models.CharField(max_length=30)

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)

class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()

4、模型的常用字段类型
4.1 BooleanField:布尔类型
4.2 CharField:字符类型
4.3 DateField:日期字段
4.4 DateTimeField:日期时间字段
4.5 DecimalField:(精确)小数字段
4.6 EmailField:Email字段
4.7 FileField:文件字段(保存和处理上传的文件)
4.8 FloatField:(浮点型)小数字段
4.9 ImageField:图片字段(保存和处理上传的图片)
4.10 IntegerField:整数字段
4.11 IPAddressField:IP字段
4.12 SmallIntegerField:小整数字段
4.13 TextField:文本字段
4.14 URLField:网页地址字段

5、模型常用的字段选项
5.1 null(null=True|False)
数据库字段的设置是否可以为空(数据进行验证)
5.2 blank(blank=True|False)
字段是否为空django会进行校验(表单进行验证)
5.3 choice轻量级的配置字段可选属性的定义
5.4 default字段的默认值
5.5 help_text字段文字帮助
5.6 primary_key(=True|False)一般情况下不需要进行定义是否主键,如果没有显示指明主键的话,django会自动增加一个默认主键:
id=models.AutoField(primary_key=True)

5.7 unique
是否唯一,对于数据表而言
5.8 verbose_name 字段的详细名称,如果不能指定该属性,默认使用字段的属性名称

字段类型和字段选项的设置更多详见:
https://docs.djangoproject.com/en/1.9/ref/models/fields/

二、定义数据模型的扩展属性
通过内部类Meta给数据模型增加扩展属性:
class Meta:
verbose_name = ‘名称‘
verbose_name_plural = ‘名称复数形式‘
ordering = [‘排序字段‘]

注释:verbose_name属性定义显示名称为中文,但是一般都是复数,为了解决显示中文后面不带s的问题,可以用verbose_name_plural=verbose_name的形式
来解决显示中文名称的变量verbose_name_plural="名称复数形式"的方式

思考题:
通过查阅上面的文档,了解设置了哪个属性可以给数据模型对应的数据表进行命名

三、定义模型的方法
定义模型的方法和普通python类方法没有太大差别,定义模型方法可以将当前对应的数据组装成具体的业务逻辑。

示例:定义__unicode__()让对象有个默认的名字
注意:python2里面用__unicode__(),python3里面用__str__()

def __str__(self):
return self.name

通过该方法可以显示出版社的名字,该方法用于python3,python2中用__unicode__()

原文地址:https://www.cnblogs.com/kindnull/p/8379773.html

时间: 2024-10-09 11:46:16

django下model.py模型的定义的相关文章

Django框架(五):模型(一) 定义属性

1. 定义属性 Django根据属性的类型确定以下信息: 当前选择的数据库支持字段的类型 渲染管理表单时使用的默认html控件 在管理站点最低限度的验证 django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列. 默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key. pk是主键的别名,若主键名为id2,那么pk是id2的别名. 属性命名限制: 不能是python的保留关键字. 不允许使用连

django下models.py数据库同步操作技巧

一.认识一个目录:目录名:migrations作用:用来存放通过makemigrations命令生成的数据库脚本,不熟悉的情况下,里面生成的脚本不要轻易修改.app目录下必要有migrations的目录且该目录下必须要有__init__.py才能正常的使用数据库同步的功能 二.认识一张数据表(django_migrations)表中的字段:app:app的名字name:脚本的文件名称applied:脚本执行的时间 三.数据库相关的命令flush:清空数据库--恢复数据库到初始状态makemigr

Django 模型 - 模型的定义

Django也遵循了MVC的分层原则,不过在做法上略有不同.    首先模型部分保持不变:Django的模型增只负责把数据传入传出数据库.然而Django里的视图却并不是显示数据的最后一步----Django的视图其实更接近MVC里传统意义上的控制器.他们是用来将模型层和表示层(有HTML和Django的模板语言组成)链接在一起的python函数.按Django开发团队的话老说就是: 我们理解的MVC里,视图的作用是描述将要显示给用户的数据.这不仅仅是数据看上去的外观,含包括如何表示数据.视图描

django框架的模型类定义及操作

在settings.py中保存了数据库的连接配置信息,Django默认初始配置使用sqlite数据库. 使用MySQL数据库首先需要安装驱动程序 pip install PyMySQL 在Django的工程同名子目录的__init__.py文件中添加如下语句 from pymysql import install_as_MySQLdb install_as_MySQLdb() 作用是让Django的ORM能以mysqldb的方式来调用PyMySQL. 修改DATABASES配置信息 DATABA

通过json序列化方式在django下传递模型数据

由于操作的原因,往往需要页面通过ajax后台加载一些数据,但是在django下,数据往往是通过models获得实例得到的,而传统的json格式只支持dict和list,创建的模型类是不能被序列化的.因此需要先导入from django.core import serializers,采用serializers.serialize("json",queryset)的方法序列化实例.在网页脚本中需要先解读json文件,再获取fields对应的各个实例属性.javascript中通过eval

Django基础之MTV模型

一.Django基础 一.Django简介 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型(Model).视图(View)和控制器(Controller).它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件.并于2005年7月在BSD许可证下发布.这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的. 1.mvc简介 http://blog.csdn.net/pi9n

django入门二(模型)

ORM简介 MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库 ORM是"对象-关系-映射"的简称,主要任务是: 根据对象的类型生成表结构 将对象.列表的操作,转换为sql语句 将sql查询到的结果转换为对象.列表 这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动 Django中的模型包含存储数据的字段和约束,对应着数据库中唯一的表 定义模型 在模型中定义属性,会

django xadmin拓展User模型

django提供四种拓展模型的方法: 1.代理模型 2.Profile拓展模型User 3.AbstractBaseUser拓展模型User 4.AbstractUser拓展模型 之前想通过第四种方法拓展User模型,对原有User模型影响较少而且不需要创建数据表,但是由于项目的其他模型已经使用User作为一对多或者多对多的外键,导致替换过程有很多错误,没能解决而放弃该方法,所以建议大家在项目开始做前就使用该方法拓展User模型. 下面简单介绍一下该方法: 1.新建APP user,在user的

Django中model的Meta选项

Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.而可用的选项大致包含以下几类: 1,unique_together unique_together这个选项用于:当你需要通过两个字段保持唯一性时使用.比如假设你希望,一个Person的FirstName和LastName两者的组合必须是唯一的,那么需要这样设置:unique_together = (("first_name", "last_name"),)一个ManyToManyF