• Django -- class Meta:详解


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

    class Book(models.Model):
        name =models.CharField(max_length=32)
     
        def __str__(self):
            return self.name
     
    class Author(models.Model):
        name = models.CharField(max_length=32)
        m = models.ManyToManyField('Book')
     
        def __str__(self):
            return self.name
     
     
    class A_to_B(models.Model):
        bid = models.ForeignKey(Book)
        aid = models.ForeignKey(Author)
     
        class Meta:
            unique_together = (
                ('bid','aid'),
            )

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

    可用的元选项

    1、abstract--抽象类

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

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

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

    class Human(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)
    class Meta: abstract=True
    class Employee(Human): joint_date=models.DateField()
    class Customer(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 参数来重写数据表的名称
    class Book(models.Model):
        name =models.CharField(max_length=32)
     
        def __str__(self):
            return self.name
        class Meta:
            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"。

  • 相关阅读:
    ARM汇编初探---汇编代码中都有哪几类指令---ARM伪指令介绍
    RPC与REST的差别
    mahout源码KMeansDriver分析之五CIMapper
    cakephp , the subquery
    我也谈 javascript 模块化 -AMD规范
    TCP/IP Protocol Fundamentals Explained with a Diagram
    js 中ajax请求时设置 http请求头中的x-requestd-with= ajax
    理解用requireJs 来实现javascript的模块化加载
    javascript 中 apply(或call)方法的用途----对象的继承
    javascript 中{}和[] 的理解
  • 原文地址:https://www.cnblogs.com/gengyufei/p/12629257.html
Copyright © 2020-2023  润新知