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