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()
<QuerySet [<Article: second>, <Article: first>]>
>>>
這個例子是表示查詢時是按照更新時間的倒敘來進行排序的。
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)
可以看到第二條數據添加了郵箱信息
以上是常見的元選項的使用。