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()
<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)


可以看到第二條數據添加了郵箱信息

 

以上是常見的元選項的使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章