zoukankan      html  css  js  c++  java
  • 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__()

  • 相关阅读:
    论语学习系列(一)
    如何编译生成 dll
    Lua学习系列(二)
    Lua学习系列(一)
    Promise对象
    ... 扩展运算符
    class类
    proxy [ˈprɒksi] 代理
    HBuilder 打包流程
    Generator [ˈdʒenəreɪtə(r)] 函数结构
  • 原文地址:https://www.cnblogs.com/kindnull/p/8379773.html
Copyright © 2011-2022 走看看