django模型的元选项

abstract选项

可以在元选项内设置abstract=True,例子:在models.py内写入

from django.db import models

# Create your models here.

class People(models.Model):
    name=models.CharField(max_length=10)
    sex=models.CharField(max_length=5)

    class Meta:
        abstract=True

class Student(People):
    c_num=models.CharField(max_length=10)   #班级编号
    age=models.IntegerField()

可以看到我们有两个模型,第一个类是一个通用的类,即每个人都会拥有名字和性别属性,指定abstract=True,指定后这个模型并不会创建表,而是作为父类。第二个类继承了People类,因此经过迁移后会生成一个meta_student表,表中拥有People和Student类的字段。

mysql> show tables;
+----------------------------+
| Tables_in_web              |
+----------------------------+
| app_class                  |
| app_course                 |
| app_phone_number           |
| app_sc                     |
| app_student                |
| app_students               |
| app_user                   |
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| meta_student               |        创建的表
+----------------------------+
18 rows in set (0.00 sec)

mysql> describe meta_student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | NO   |     | NULL    |                |
| sex   | varchar(5)  | NO   |     | NULL    |                |
| c_num | varchar(10) | NO   |     | NULL    |                |
| age   | int         | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
5 rows in set (0.02 sec)

app_label选项

比如有两个应用,是app和meta应用,在meta内创建一个模型,并指定app_label='app',表示指定这个模型是属于app应用的,因此在创建的时候创建的表名为app_开头。


class Article(models.Model):
    title=models.CharField(max_length=100)
    body=models.TextField()

    class Meta:
        app_label='app'



mysql> show tables;
+----------------------------+
| Tables_in_web              |
+----------------------------+
| app_article                |        创建的表
| app_class                  |
| app_course                 |
| app_phone_number           |
| app_sc                     |
| app_student                |
| app_students               |
| app_user                   |
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| meta_student               |
+----------------------------+

db_table选项

使用模型创建表默认创建的表名为 应用名_+类名,可以使用db_table选项来指定表的名字

class Class(models.Model):
    #other fields
    
    class Meta:
        db_table='class'

 

ordering选项

使用ordering选项可以设置查询时排列的顺序

class Article(models.Model):
    title=models.CharField(max_length=100)
    body=models.TextField()
    updated=models.DateTimeField(auto_now_add=True)     #更新时

    class Meta:
        ordering=['-updated',]


    def __str__(self):
        return self.title


>>> from meta.models import Article
>>> a=Article.objects.create(title='first',body='sun')
>>> a=Article.objects.create(title='second',body='sun')
>>> Article.objects.all()
, ]>
>>>

这个例子是表示查询时是按照更新时间的倒叙来进行排序的。

 

proxy选项

这个选项可以在一个子类里继承一个已存在的模型,并在这个子类里设置proxy=True,在子类里可以增加方法和其他的元选项,这个子类便充当一个代理的作用。

from django.contrib.auth.models import User

class Person(User):
    class Meta:
        proxy=True
        ordering=['email',]

    def add_email(cls):
        cls.email='[email protected]'
        cls.save





使用这个类来创建一个用户
>>> from meta.models import Person
>>> person=Person()
>>> person.username='zhang'
>>> person.password='123'
>>> person.add_email()
>>> person.save()


对Person的操作会更新到父类User中,Person只是一个代理,并不会创建一个新的表,只是在父类的基础上
添加方法
mysql> select * from auth_user;
+----+-----------+------------+--------------+----------+------------+-----------+-------------------+----------+-----------+----------------------------+
| id | password  | last_login | is_superuser | username | first_name | last_name | email             | is_staff | is_active | date_joined                |
+----+-----------+------------+--------------+----------+------------+-----------+-------------------+----------+-----------+----------------------------+
|  1 | 123456789 | NULL       |            0 | sun      |            |           |                   |        0 |         1 | 2020-05-30 13:04:24.034490 |
|  2 | 123       | NULL       |            0 | zhang    |            |           | [email protected] |        0 |         1 | 2020-05-31 00:46:26.053332 |
+----+-----------+------------+--------------+----------+------------+-----------+-------------------+----------+-----------+----------------------------+
2 rows in set (0.00 sec)


可以看到第二条数据添加了邮箱信息

 

以上是常见的元选项的使用。

你可能感兴趣的:(django框架)