Django Model模型层——模型Meta详解

 Pala   2017-08-10 11:37   109 人阅读  0 条评论

模型定义的基本结构如下:

from django.db import models

class ModelName(models.Model):
    field1 = models.XXField(...)
    field2 = models.XXField(...)
    ...
    class Meta:
        db_table=..
        abstract=..
        app_label=..
        db_tablespace=..
        default_manager_name=..
        get_latest_by=..
        managed=..
        order_with_respect_to=..
        ordering=..
        default_permissions=..
        proxy=..
        required_db_features=..
        required_db_vendor=..
        unique_together=..
        index_together=..
        verbose_name=..
        verbose_name_plural=..


解析如下:

l   所有Django模型继承自django.db.models.Model类。

l   通过其中的类属性定义模型字段,模型字段必须是某种models.XXField类型。

l   通过模型类中的Meta子类定义模型元数据,比如数据库表名、数据默认排序方式等

Meta类的属性名由Django预定义,常用的Meta类属性汇总如下

l   abstract: True or False,标识本类是否为抽象基类

l   app_label:定义本类所属的应用,比如app_label=’myapp’

l   db_table:映射的数据表明,比如db_table=’moments’。

技巧:如果Meta中不提供db_table字段,则Django会为模型自动生成数据表名,生成的格式为‘应用名_模型名’,比如应用app的模型Comment的默认数据表名为app_comment。

l   db_tablespace:映射的表空间名称。表空间的概念只在某些数据库如Oracle中存在,不存在表空间概念的数据库将忽略本字段

l   default_related_name:定义本模型的反向关系引用名称,默认与模型名一致。

l   get_latest_by:定义按哪个字段值排列以获得模型的开始或结束记录,本属性只通常执行一个日期或整型的模型字段

l   managed:True or False,定义Django的manage.py命令行工具是否管理本模型。本属性默认为True,如果将其设为False,则运行python manage.py migrate时将不会在数据库中生成本模型的数据表,所有需要手动维护数据库的定义。

l   order_with_respect_to:定义本模型可以按照某外键引用的关系排序。

l   ordering:本模型记录的默认排序字段,可以设置多个字段,默认以升序排列,如果以降序排列则需要在字段名前家“负号”。比如如下定义按username升序和pub_date降序排列。

class Comment(models.Model):
    username = models.CharField(max_length=30)
    pub_date = models.DateField(auto_now_add=True)

    class Meta:
        ordering = ['username', '-pub_date']

l   default_permissions:模型操作权限,默认为default_permissions=(‘add’,’change’,’delete’)

l   proxy:True or False,本模型及所有继承自本模型的子模型是否为代理模型。

l   required_db_features:定义底层数据库所必须具备的特性。比如required_db_features=[“gis_enabled”]只将本数据模型生成在满足gis_enabled特性的数据库中。

l   required_db_vendor:定义底层数据库的类型,比如SQLite、PostgreSQL、MySQL、Oracle、如果定义了本属性,则模型只能在其声明的数据库中被维护。

l   unique_together:用来设置的不重复的字段组合,必须唯一(可以建个多个字段作为联合唯一)

class Comment(models.Model):
    username = models.CharField(max_length=30)
    pub_date = models.DateField(auto_now_add=True)

    class Meta:
        unique_together= ['username', 'pub_date']

unique_together本身是一个元祖,所以可以设置多个这样的唯一约束。

l   index_together:定义联合索引的字段,可以设置多个。

class Comment(models.Model):
    username = models.CharField(max_length=30)
    pub_date = models.DateField(auto_now_add=True)

    class Meta:
        index_together= ['username', 'pub_date']

l   verbose_name:指定一个易于理解和表述的单数形式的对象名称。如果这个值没有设置,则Django将会使用该model的雷鸣的分词形式作为它的对象表述名,即CamelCase将会被转换为camel case。

l   verbose_name_plural:知名一个易于理解和表述的复数形式的对象名称。

更多相关介绍:

    https://docs.djangoproject.com/en/1.11/ref/models/options/

本文地址:http://chenxm.cc/post/258.html
版权声明:本文为原创文章,版权归 Pala 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?