Django -- class Meta:详解

摘要:
向模型中添加classMeta是完全可选的,不需要所有选项。例如:blog_Type在Meta类中使用db。table参数覆盖数据表classBook的名称:name=models。CharFielddef__ str__:返回自身。nameclassMeta:db_Table=“book”3.Managed-默认情况下,管理表的创建和删除为true,这意味着Django在migrate命令中创建适当的数据表,并在flush管理命令中删除它们。换句话说,Django将管理这些数据表的生命周期。如果为False,Django将不会为当前模型创建或删除数据表。

模型元数据是“任何不是字段的数据”,比如排序选项(ordering)数据库表名(db_table)或者人类可读的单复数名称verbose_nameverbose_name_plural)。在模型中添加class Meta是完全可选的,所有选项都不是必须的

classBook(models.Model):
    name =models.CharField(max_length=32)
 
    def __str__(self):
        returnself.name
 
classAuthor(models.Model):
    name = models.CharField(max_length=32)
    m = models.ManyToManyField('Book')
 
    def __str__(self):
        returnself.name
 
 
classA_to_B(models.Model):
    bid =models.ForeignKey(Book)
    aid =models.ForeignKey(Author)
 
    classMeta:
        unique_together =(
            ('bid','aid'),
        )

上面定义了3张表,一张是Book表,一张是Author表,然后定义了一个多对多关系的A_to_B表,最后定义了元数据,它的意思上面的多对多表具有唯一约束

可用的元选项

1、abstract--抽象类

  1. 这个属性是定义当前的模型类是不是一个抽象类
  2. 所谓抽象类是不会生成相应数据库表的
  3. 一般我们用它来归纳一些公共属性字段,然后继承它的子类能够继承这些字段。

比方以下的代码中Human是一个抽象类。Employee是一个继承了Human的子类,那么在执行数据迁移命令时,不会生成Human表,可是会生成一个Employee表,它包括了Human中继承来的字段。

然后, 假设再加入一个Customer模型类,它能够相同继承Human的公共属性:

classHuman(models.Model):
    name=models.CharField(max_length=100)
    GENDER_CHOICE=((u'M',u'Male'),(u'F',u'Female'),)
    gender=models.CharField(max_length=2,choices=GENDER_CHOICE,null=True)
classMeta: abstract=True
classEmployee(Human): joint_date=models.DateField()
classCustomer(Human): first_name=models.CharField(max_length=100) birth_day=models.DateField()

2、db_table--重写数据表名称

  1. 默认情况下,Django 会根据模型类的名称和包含它的应用的名称自动指定数据库表名称。eg:blog_type(blog:APP名称,type:模型类名称)
  2. 使用 Meta类中的 db_table 参数来重写数据表的名称
classBook(models.Model):
    name =models.CharField(max_length=32)
 
    def __str__(self):
        return self.name
classMeta:
        db_table = "book"

3、managed--管理表的创建、删除

  1. 默认为True,意思是Django在migrate命令中创建合适的数据表,并且会在 flush 管理命令中移除它们。换句话说,Django会管理这些数据表的生命周期。
  2. 如果是False,Django 就不会为当前模型创建和删除数据表。如果当前模型表示一个已经存在的,通过其它方法建立的数据库视图或者数据表,这会相当有用
  3. 当设置为managed=False时,需要注意一下几点:
    • 如果你不声明它的话,会向你的模型中添加一个自增主键。为了避免给后面的代码读者带来混乱,强烈推荐你在使用未被管理的模型时指定数据表中所有的列
    • 如果一个带有managed=False的模型含有指向其他未被管理模型的ManyToManyField,那么多对多连接的中介表不会被创建
    • 但是,一个被管理模型和一个未被管理模型之间的中介表会被创建。
    • 如果你需要修改这一默认行为,创建中介表作为显式的模型(设置为managed),并且使用ManyToManyField.through为你的自定义模型创建关联。
    • 对于带有managed=False的模型的测试,你要确保在测试启动时建立正确的表

4、ordering--排序

对象默认的顺序,获取一个对象的列表时使用:

ordering = ['-order_date']
它是一个字符串的列表或元组。每个字符串是一个字段名,前面带有可选的“-”前缀表示倒序。前面没有“-”的字段表示正序。使用"?"来表示随机排序

  1. 例如,要按照pub_date字段的正序排序,这样写:   ordering = ['pub_date']
  2. 按照pub_date字段的倒序排序,这样写:   ordering = ['-pub_date']
  3. 先按照pub_date的倒序排序,再按照 author 的正序排序,这样写: ordering = ['-pub_date', 'author']

警告:

排序并不是没有任何代价的操作。你向ordering属性添加的每个字段都会产生你数据库的开销。你添加的每个外键也会隐式包含它的默认顺序

5、unique_together--添加unique

用来设置的不重复的字段组合unique_together = (("driver", "restaurant"),)

  1. 它是一个元组的元组,组合起来的时候必须是唯一的
  2. 它在Django后台中被使用,在数据库层上约束数据(比如,在 CREATE TABLE 语句中包含 UNIQUE语句)。

为了方便起见,处理单一字段的集合时,unique_together 可以是一维的元组:

unique_together = ("driver", "restaurant")

6、index_together--添加索引

用来设置带有索引的字段组合:

index_together = [
   ["pub_date", "deadline"],
  ]


列表中的字段将会建立索引(例如,会在CREATE INDEX语句中被使用)。


为了方便起见,处理单一字段的集合时,index_together可以是一个一维的列表:index_together = ["pub_date", "deadline"]

7、verbose_name--模型类的单数名称

对象的一个易于理解的名称,为单数:

verbose_name = "pizza"
如果此项没有设置,Django会把类名拆分开来作为自述名,比如CamelCase 会变成camel case

8、verbose_name_plural--模型类的复数名称

该对象复数形式的名称:

verbose_name_plural = "stories"
如果此项没有设置,Django 会使用 verbose_name + "s"。

免责声明:文章转载自《Django -- class Meta:详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Matlab基本函数-ginput函数网页的摘要信息下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Javascript 计算请假天数

转载请注明本文地址:https://www.cnblogs.com/qiaoge0923/p/10219155.html  计算请假天数,笼统来说就是计算两个日期的差值。对于JS来说,两个时间直接相减,得到的是这两个时间差的毫秒数。 先上代码后贴图。 1.测试数据 后文中用到的测试数据如下: var dateStart = '2018-12-01 04...

vue自定义日期选择,类似美团日期选择,日历控件,vue日历区间选择

一个日历的控件,基于vue的,可以日历区间选择,可用于酒店日历区间筛选,动手能力强,可以修改成小程序版本的,先上效果图 里面的颜色样式都是可以修改的 选择范围效果 话不多说,直接上干货,代码可以直接复制访问 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4...

将日期格式转换为时间戳

1. 将时间戳转换成日期格式 // 简单的一句代码 var date = new Date(时间戳); //获取一个时间对象 /** 1. 下面是获取时间日期的方法,需要什么样的格式自己拼接起来就好了 2. 更多好用的方法可以在这查到 -> http://www.w3school.com.cn/jsref/jsref_obj_date.asp...

PHP date("Y-m-d H:i:s");获取当前时间 差8小时解决办法

原因: 从php5.1.0开始,php.ini里加了date.timezone这个选项,并且默认情况下是关闭的也就是显示的时间(无论用什么php命令)都是格林威治标准时间和我们的时间(北京时间)差了正好8个小时。 关于timezone 大陆内地可用的值是:Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi ,PRC(依次为...

GreenPlum 提取数据表信息

参考: https://www.alberton.info/postgresql_meta_info.html https://my.oschina.net/Kenyon/blog/226600 列信息: greenplum: https://www.alberton.info/postgresql_meta_info.html 系统表: greenpl...

Django中的表单

Django中的表单: Django中的表单丰富了传统的HTML语言中的表单。在Django中的表单,主要做以下两件事: 渲染表单模板。 表单验证数据是否合法。 Django中表单使用流程: 在讲解Django表单的具体每部分的细节之前。我们首先先来看下整体的使用流程。这里以一个做一个留言板为例。首先我们在后台服务器定义一个表单类,继承自django....