'''
數據庫模型
每個屬性代表一個數據庫的字段
'''
# 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,也可以自定義,(查詢方法)
Django之Meta選項
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.