Django之Meta選項

'''
    數據庫模型
    每個屬性代表一個數據庫的字段
'''

# CharField 相當於 varchar

'''
    Meta選項
'''
# app_label
# 用來指定你的model是屬於哪個app
'''
    繼承一:
'''
# 抽象基類,如果你需要將一些公共信息放在許多模型中,可以在Meta選項中設置
# abstract = True   表示作爲一個基類,可以被繼承,但是此類不會生成數據庫,僅作爲一個類
# 對Meta的繼承,
# 當你在繼承抽象基類的時候,如果子類沒有聲明Meta類,將繼承父類的Meta類,也可以自己定義
'''
    class Meta(CommonInfo.Meta):
        db_table = 'student_info'
'''


'''
    繼承二:
'''
# 每個模型對應於自己的數據庫表,可以單獨查詢和創建。繼承關係引入子模型與其每個父模型之間的鏈接通過自動創建OneToOneField
'''
    from django.db import models
    
    class Place(models.Model):
        name = models.CharField(max_length=50)
        address = models.CharField(max_length=80)
    
    class Restaurant(Place):
        serves_hot_dogs = models.BooleanField(default=False)
        serves_pizza = models.BooleanField(default=False)
        
    >>> Place.objects.filter(name="Bob's Cafe")
    >>> Restaurant.objects.filter(name="Bob's Cafe")
    也可以通過基類查詢子類
    >>> p = Place.objects.get(id=12)
    # If p is a Restaurant object, this will give the child class:
    >>> p.restaurant
'''
# 自動創建的OneToOneField
'''
    place_ptr = models.OneToOneField(
    Place, on_delete=models.CASCADE,
    parent_link=True,
)
'''
# 如果在子類中,有M2M字段,且關聯父類,則需要給M2M字段添加related_name屬性
'''
    class Supplier(Place):
        customers = models.ManyToManyField(Place)
'''
# 多重繼承中,如果多個父類包含一個Meta類,則只會使用第一個類,而將忽略所有其他類。
# 在繼承時,只能有一個主鍵,否則就會報錯


'''
    related_name和related_query_name的用法
'''
# 在外鍵和多對多關係中使用,用來配置反向名稱和反向查詢名稱,還要指定app名稱和class名稱
'''
    使用方法:
    
    from django.db import models
    class Base(models.Model):
        m2m = models.ManyToManyField(
            OtherModel,
            related_name="s",
            related_query_name="d",
        )

    OtherModel.objects.filter(d__name='learn java')
    other = OtherModel.objects.get(pk=1)
    other.s.all()
    
'''
# 如果指定related_name和related_query_name的話
'''
    OtherModel.objects.filter(base_set__name='learn java')
    other = OtherModel.objects.get(pk=1)
    other.Base_set.all()
'''

# 代理模型,設置proxy=True來告訴django這是一個代理(繼承的必須是非抽象類且只能代理一個數據庫表單)
'''
    class Person(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=30)
    
    class MyPerson(Person):
        class Meta:
            proxy = True
    
        def do_something(self):
            # ...
            pass
            
    >>> p = Person.objects.create(first_name="foobar")
    >>> MyPerson.objects.get(first_name="foobar")
    
    可以進行各種操作
'''

'''
# indexes = (fields =(),name = None,db_tablespace = None, opclasses =(),condition = None)  索引配置
'''
'''
    db_tablespace   用於索引的數據庫表空間
	opclasses  用於此索引的PostgreSQL運算符類的名稱。使用時需要定義Index.name
	GinIndex(name='json_index', fields=['jsonfield'], opclasses=['jsonb_path_ops']
	condition   索引限制
	condition=Q(pages__gt=400) 索引記錄超過400的。

'''
# index_together=[]   組合索引
# unique_together=[]   聯合主鍵
# base_manager_name 用於設置模型的管理器_base_manager的名稱
# default_manager_name  用於設置模型的管理器_default_manager的名稱
# default_related_name  與字段中的related_query_name類似

'''
    class Foo(models.Model):
        pass
    class Bar(models.Model):
        foo = models.ForeignKey(Foo)
    
        class Meta:
            default_related_name = 'bars'   
    >>> bar = Bar.objects.get(pk=1)
    >>> # 不能再使用"bar"作爲反向查詢的關鍵字了。
    >>> Foo.objects.get(bar=bar)
    >>> # 而要使用你自己定義的"bars"了。
    >>> Foo.objects.get(bars=bar)
'''
# db_table 用來設置模型的數據庫表單的名稱
# get_latest_by 爲了使用模型中的 latest()和 earliest()方法,要配置這個選項
# get_latest_by = ["",""]  列表中的元素爲字段名,與ordering裏面的字段用法類似
# managed 默認爲True,Django會管理該數據庫表的生命週期,爲False則不會對此模型執行數據庫表創建或刪除操作

'''
    order_with_respect_to
    通常用在ForeignKey中
    當order_with_respect_to設置,提供了兩個額外的方法來檢索和設置相關對象的順序:get_RELATED_order() 和set_RELATED_order(),
    其中RELATED是小寫的表名稱。例如,假設一個Question對象有多個相關Answer對象,
    
'''
# 示例:
'''
    class Question(models.Model):
        text = models.TextField()
        # ...
    
    class Answer(models.Model):
        question = models.ForeignKey(Question, on_delete=models.CASCADE)
        # ...
    
        class Meta:
            order_with_respect_to = 'question'
    
    在創建數據庫表的時候,Answer表中會自動新建一個_order字段,該字段用來存儲排序的序號,按外鍵進行分類(從0開始)
'''
# 使用方法:
'''
    >>> question = Question.objects.get(id=1)
    >>> question.get_answer_order()   默認是按照創建的順序排列
    <QuerySet [1, 2, 3, 4]>

    question.set_answer_order([3, 1, 2, 4])  也可以自定義排序,這會改變_order字段的值
    _order字段的值按照順序會變爲[1,2,0,3]
    
    改變順序後,執行下面操作
    >>> answer = Answer.objects.get(id=2)
    >>> answer.get_next_in_order()   獲取下一行數據
    <Answer: Answer object (4)>
    >>> answer.get_previous_in_order()  獲取前一行數據
    <Answer: Answer object (1)>
    
'''
# ordering 設置對象的默認順序
'''
    ordering = ['pub_date']  升序
    ordering = ['-pub_date']  降序
    也可以使用查詢表達式,author升序排序,並將空值排在最後
    ordering = [F('author').asc(nulls_last=True)]
'''

# permissions 創建此對象時進入權限表的額外權限。爲每個模型自動創建添加,更改,刪除和查看權限
# permissions = [('can_deliver_pizzas', 'Can deliver pizzas')]

# default_permissions  Django默認給所有的模型設置('add', 'change', 'delete', 'view').
# 你可以自定義這個選項,比如設置爲一個空列表,表示你不需要默認的權限,但是這一操作必須在執行migrate命令之前。

# required_db_features 如果將此列表設置爲['gis_enabled'],則僅在啓用GIS的數據庫上同步模型

# required_db_vendor 聲明模型支持的數據庫。Django默認支持sqlite, postgresql, mysql, oracle,如果此屬性不爲空且當前連接供應商與其不匹配,則不會同步模型。

# select_on_save,默認值是False,決定是否使用1.6版本之前的django.db.models.Model.save()算法保存對象

# constraints 要在模型上定義的約束列表
'''
    constraints = [
                models.CheckConstraint(check=models.Q(age__gte=18), name='age_gte_18'),
            ]
    年齡小於等於18
'''

# verbose_name 用來設置數據庫表的名稱,最常用的配置(單數名,就是英語中的單複數)
# verbose_name = "博客"

# verbose_name_plural 數據庫表的複數名稱,如果不設置則爲 verbose_name + 's'

# label  只讀元數據,等同於app_label.object_name
# label_lower 與上面相同,只不過是小寫的模型名稱

# 暫定, Manager()沒有學的很清楚

'''
    from django.db import models
    
    class Person(models.Model):
        # Add manager with another name
        people = models.Manager()
'''
# 每個非抽象Model類至少有一個Manager,也可以自定義,(查詢方法)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章