Django笔记03:ORM中的元数据Meta

在每个模型类的里面我们还可以定义一个子类Meta,这个子类可以定义一些有关数据库或者数据表的相关信息,这些相关信息我们称之为元数据,利用这些元数据的定义,我们可以定义数据库的名称等信息。那么常用的元素据还有哪些呢?

1.定义数据库的表名

每一个Django模型类都会定义一个数据表,数据表的表明默认是用下划线_链接的APP的名字和模型类的名字,比如你定义了一个blog的APP,在blogAPP中的model.py里面定义了一个Post的模型类,那么这个POST的表的表名就是blog_post。如果你不想这样命名应该怎样做呢?这时候需要在子类Meta中定义一个元数据:db_table=”自定义名”。

另外,还有一种方式可以定义数据表的名字,只不过这种方式改变的仅仅是admin后台的显示,而不实际在mysql数据库中生效:verbose_name=”想要在admin后台显示的数据表名”。复数形式需要用verbose_name_plural=” “,不过我们用中文表示的话设置的跟verbose_name一样就好了,因为中文没有单复数,只有英文里有。

2.排序

默认情况下数据表会按照主键来进行从小到大的排序,但是如果你有特殊的需求,想按照某一个字段的顺序来进行排序应该怎样做呢?你需要做的仅仅是定义一个元数据:ordering=[“需要升序排列的字段名”]。注意:等号右边必须以元组或者列表的形式。这样的话也可以定义多个字段的排序了。

3.不生成数据表

如果你定义了一个模型类,但是你并不想让这个模型类生成数据表,仅仅是想让其他的类来继承这个类,那么你就需要定义这样一个元数据:abstract=True。定义完之后这个类就成了基类,不会再数据库中生成数据表。

需要注意的一点是,定义了abstract元数据的模型类就不用再admin后台中注册了,否者会报错的。

4.联合唯一键

之前我们在《Django学习笔记02:ORM中常用字段类型与参数》 提到一个unique的参数,如果某个字段设置了这个参数为True那么如果有两个记录的这个字段的值是一样的那么第二条记录就会被拒绝插入到数据库中,比如说你设置了name这个字段的Unique参数,现在表中已经有了一个名叫张三的记录,如果你再插入一个名叫张三的用户,就会被拒接。

但是如果真的有另一个叫做张三的用户怎么办呢?毕竟在中国重名的比比皆是,这时我们需要对其他字段进行比对,比如说看第二个张三的birthday和address是不是一样,如果仅仅是name相同,而birthday和address不同,那么说明这就不是同一个人,我们没有理由不让插入第二条数据。但是如果这三个字段的信息都是一样的,那我们几乎可以百分之百的确定这两条是相同的数据,我们可以拒绝插入。

解释完之后我们可以这样定义联合唯一键的元数据:unique_together=((xx,xx,xx,…),(),(),()…),unique_together接受的是一个二元数组,也就是说我们可以设置若干对这样的联合唯一键,对数据表进行约束。为了方便,对于只有一组约束的情况下,可以简单地使用一维元素,例如:

unique_together = ('name', 'birth_day', 'address')

5.其他元数据

  1. app_label:如果定义了模型的app没有在INSTALLED_APPS中注册,则必须通过此元数据声明它属于哪个app,例如:app_label = ‘myapp’

参考资料

http://www.liujiangblog.com/course/django/99

你可能感兴趣的:(Django笔记,Django学习笔记)