可以在元选项内设置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和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选项来指定表的名字
class Class(models.Model):
#other fields
class Meta:
db_table='class'
使用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=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)
可以看到第二条数据添加了邮箱信息
以上是常见的元选项的使用。