zoukankan      html  css  js  c++  java
  • 模型层中模型的基本了解

    模型简介

    模型是你的数据的唯一的、确定的信息源。 它包含你所储存数据的必要字段和行为。 通常,每个模型对应数据库中唯一的一张表。

    基础:

    • 每个模型都是一个Python类,它们都是django.db.models.Model的子类。
    • 每一个模型属性都代表数据库中的一个字段。

    简单示例

    from django.db import models
    
    class Person(models.Model):
        name = models.CharField(max_length=30)
        age = models.IntegerField()
    

    定义好模型之后,接下来你需要告诉Django这些模型。 你要做的就是修改配置文件中的INSTALLED_APPS设置,在其中添加model.py所在应用的名称。

    例如,如果你的应用的模型位于app.models(由manage startapp app 命令自动创建的结构),INSTALLED_APPS部分看上去应该是:

    INSTALLED_APPS = [
        #...
        'app.apps.AppConfig',
        #...
    ]
    

    基本迁移命令

    python manage.py makemigrations 讲model记录在django
    python manage.py migrate  讲django中的model迁移到数据库中
    python manage.py sqlmigrate app 序列号  查看生成表的sql操作,该操作并不会直接迁移到数据库
    

    配置好模型之后,执行迁移命令,上面的Person模型会在数据库中创建这样一张表(如果不配置数据库,默认创建在django自带的sqlite3):

    CREATE TABLE "app_person" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(12) NOT NULL, "age" integer NOT NULL);
    

    一些技术上的注意事项:

    • 这个表的名称app_person,是根据模型中app的名称加类名的小写组合而成,也可以重写为别的名称
    • id字段是自动添加的,但这个行为可以被重写

    字段类型

    模型中的每个字段都是相应的Field类的实例。 Django根据Field的类型确定以下信息:

    • 列类型,它告知数据库要存储哪种数据(例如,INTEGER,VARCHAR,TEXT)。
    • 渲染表单时使用的默认HTML widget(例如,input type="text", select)。
    • 最低限度的验证需求,它被用在 Django 管理站点和自动生成的表单中。

    常用字段

    AutoField

    自增的整形字段,必填参数primary_key=True,则成为数据库的主键。无该字段时,django自动创建。

    一个model不能有两个AutoField字段。

    IntegerField

    一个整数类型。数值的范围是 -2147483648 ~ 2147483647。

    CharField

    字符类型,必须提供max_length参数。max_length表示字符的长度。

    DateField

    日期类型,日期格式为YYYY-MM-DD,相当于Python中的datetime.date的实例。

    参数:

    • auto_now:每次修改时修改为当前日期时间。
    • auto_now_add:新创建对象时自动添加当前日期时间。

    auto_now和auto_now_add和default参数是互斥的,不能同时设置。

    DatetimeField

    日期时间字段,格式为YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime的实例。

    字段选项

    每个字段都接受一组与字段有关的参数,例如,CharField需要max_length参数来指定VARCHAR数据库字段的大小。

    常用字段选项

    null

    如果为True,Django将在数据库中把空值存储为NULL。 默认为False

    blank

    如果为True,该字段允许为空值, 默认为False。

    要注意,这与null不同。null纯粹是数据库范畴,指数据库中字段内容是否允许为空,而blank是表单数据输入验证范畴的。 如果一个字段的blank=True,表单的验证将允许输入一个空值。 如果字段的blank=False,该字段就是必填的。

    choices

    由二项元组构成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,而且这个选择框的选项就是choices 中的选项。

    这是一个关于 choices 列表的例子:

    COURSE_CHOICES = (
        (1, 'Python'),
        (2, 'Go'),
        (3, 'Linux'),
    )
    

    每个元组中的第一个元素是将被存储在数据库中的值。 第二个元素将由django显示。 给定一个模型实例,可以使用get_foo_display()方法来访问选项字段的显示值。(foo为设置choices的字段名)

    default

    数据库中字段的默认值,如果自身传入了值,则使用传入的,没传则用默认的

    verbose_name

    Admin中显示的字段名称

    primary_key

    数据库中字段是否为主键

    unique

    如果为True, 则这个字段在整张表中必须是唯一的

    关系

    显然,关系数据库的威力体现在表之间的相互关联。 Django 提供了三种最常见的数据库关系:多对一(many-to-one),多对多(many-to-many),一对一(one-to-one)。

    多对一

    Django 使用django.db.models.ForeignKey定义多对一关系。 和使用其它Field类型一样:在模型当中把它做为一个类属性包含进来。

    ForeignKey需要一个位置参数:与该模型关联的类。

    建议你用被关联的模型的小写名称做为字段的名字,当然,你也可以起别的名字

    多对多(如第三张表有额外需求,查阅官网手册)

    ManyToManyField用来定义多对多关系, 和使用其它Field类型一样:在模型当中把它做为一个类属性包含进来。

    ManyToManyField需要一个位置参数:和该模型关联的类。

    建议你以被关联模型名称的复数形式做为ManyToManyField的名字

    在哪个模型中设置ManyToManyField并不重要,在两个模型中任选一个即可 —— 不要两个模型都设置

    一对一

    OneToOneField用来定义一对一关系。 和使用其它Field类型一样:在模型当中把它做为一个类属性包含进来。

    当某个对象想扩展自另一个对象时,最常用的方式就是在这个对象的主键上添加一对一关系。

    OneToOneField要一个位置参数:与模型关联的类

    Meta选项

    使用内部的class Meta 定义模型的元数据

    常见Meta选项

    ordering   //排序选项
    db_table   //数据库表名
    verbose_name  //单数
    verbose_name_plural //复数
    
    

    模型属性

    objects
    模型最重要的属性是Manager。 它是Django 模型进行数据库查询操作的接口,并用于从数据库提取实例。 如果没有自定义Manager,则默认的名称为objects。 Managers 只能通过模型类访问,而不能通过模型实例访问。
    
    定义
    class Author(models.Model):
        name = models.CharField(max_length=12)
        age = models.IntegerField()
        manage = models.Manager()
    

    抽象基类

    当你想将一些共有信息放进其它一些模型的时候,抽象化类是十分有用的。 你编写完基类之后,在Meta类中设置abstract=True, 这个模型就不会被用来创建任何数据表。 取而代之的是,当它被用来作为一个其他模型的基类时,它的字段将被加入子类的字段中。 如果抽象基类和它的子类有相同的字段名,那么将会出现error(并且Django将抛出一个exception)

    class Book(models.Model):
        ....
        class Meta:
             abstract = True
    

    参考链接

    https://docs.djangoproject.com/en/1.11/

    https://www.cnblogs.com/maple-shaw/articles/9323320.html

  • 相关阅读:
    常用的DOCS命令
    [51NOD1126]求递推序列的第n项(矩阵快速幂)
    [HDOJ2830]Matrix Swapping II(胡搞)
    [每天一道A+B]签到检测程序
    [HIHO1260]String Problem I(trie树)
    [HIHO1300]展胜地的鲤鱼旗(栈,dp)
    [HIHO1299]打折机票(线段树)
    [51NOD1087]1 10 100 1000(规律,二分)
    [POJ2002]Squares(计算几何,二分)
    [HDOJ1015]Safecracker(DFS, 组合数学)
  • 原文地址:https://www.cnblogs.com/williamweson/p/13039568.html
Copyright © 2011-2022 走看看