• 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__()

  • 相关阅读:
    DC中为什么要用Uniquify?
    hdu 1596 find the safest road
    hdu2112 HDU Today
    hdu 2066 一个人的旅行
    poj 3026 Borg Maze
    poj 1979 Red and Black
    poj 1321 棋盘问题
    hdu 1010 Tempter of the Bone
    hdu 4861 Couple doubi
    codeforces584B Kolya and Tanya
  • 原文地址:https://www.cnblogs.com/kindnull/p/8379773.html
Copyright © 2020-2023  润新知