刻苦銘心的公開(kāi)課作文200字
一、抽象繼承:

順便復習OOP思想,繼承是面向對象的大前提╮(╯▽╰)╭,抽象類(lèi),之所以被創(chuàng )建是用來(lái)被繼承的;一個(gè)類(lèi)如果包含任何一種抽象方法,那么它就是抽象類(lèi);抽象方法一定要在子類(lèi)中被復寫(xiě);在繼承關(guān)系中,抽象類(lèi)永遠在樹(shù)枝節點(diǎn)上……扯遠了,而且對于Python來(lái)說(shuō),已經(jīng)沒(méi)有這么多約束了。
回到Django的Model,也一樣,當我們需要某些公共方法字段時(shí),就需要一個(gè)父類(lèi)為其他子類(lèi)服務(wù),這個(gè)父類(lèi)沒(méi)有manager,Django也不為這個(gè)類(lèi)創(chuàng )建表,這種繼承的定義方法如下:
class Animal(models.Model):
name = models.CharField(max_length=50)
age = models.PositiveIntegerField()
# 下面這句決定了Animal是一個(gè)抽象類(lèi)/Model
class Meta:
abstract = True
class Human(Animal):
kind_hearted = models.BooleanField()
sex = models.CharField('sex', choices=(('m','male'), ('f', 'female')), max_length=1)
#...
上例中,我們的Human子model中,自然包含了name和age的字段,但是Animal不能作為正常model使用,由于沒(méi)有manager,所以也不能實(shí)例化、保存。在子類(lèi)中,不可以建立與這個(gè)抽象父類(lèi)中的相同的字段,Django表示對報錯負責。
二、正常的繼承,多重繼承,Joined映射
和抽象繼承的主要區別是父類(lèi)這時(shí)也可以擁有數據庫表了,并且不在身為存儲公共信息的抽象類(lèi)了,父類(lèi)也可以進(jìn)行實(shí)例化,查詢(xún)等操作了。
class Country(models.Model):
name = models.CharField(max_length=10)
#...
class Province(Country):
return = models.BooleanField()
#...
三、代理
即在子類(lèi)中只能增加方法,而不能增加屬性,在不影響父類(lèi)數據存儲的前提下,使子類(lèi)繼承父類(lèi),此時(shí)子類(lèi)稱(chēng)為父類(lèi)的“代理”。例如:
from django.contrib.auth.models import User
class Person(User):
# this makes a class proxy
proxy = True
def can_dance(self):
return True
# both Yellow and Black can_dance :)
class Yellow(Person):
hometown = models.CharField(max_length=30)
class Black(Person)
tribe_name = models.CharField(max_length=100)
我們?yōu)镻erson類(lèi)增加了一個(gè)方法,可以跳舞,并且保持了User的數據字段的不變。
Django的Queryset是什么,objects是什么,objects在哪里可以定義。
query + set,已經(jīng)能猜出大概,它對應著(zhù)數據庫中的若干條記錄。
例如有一個(gè)叫做Order的模型,在project的根目錄下進(jìn)入shell進(jìn)行操作:
$python manage.py shell
>>>from app.order.models import Order
>>>type(Order.objects)
>>>
>>>order = Order.objects.all()
>>>type(order)
上述方法很常用,看繼承關(guān)系去理解Queryset和objets。objects是每個(gè)Model默認的manager類(lèi),通過(guò)manager的方法(也可通過(guò)QuerySet的方法得到,當然QuerySet也來(lái)自于manager),得到相應的Queryset,用以對數據庫模型字段進(jìn)行更多的操作。
objects(manager)方法可以自定義添加,也可以直接賦值覆蓋掉默認的管理方法。
試著(zhù)添加一個(gè)新的管理器的步驟是這樣,首先定義一個(gè)manager類(lèi)繼承自models.Manager,并在其中對self進(jìn)行操作,如下:
# new manager
class OrderManager(models.Manager):
def title_count(self, keyword):
return self.filter(title__icontains=keyword).count()
class Order(models.Models):
title = models.CharField(max_length=100)
# ...
#objects = models.Manager()
objects = OrderManager()
def __unicode__(self):
return self.title
上述例子中我們把OrderManager賦值給了objects,替換了默認的管理器。
tips:如果增加了新的管理器,且沒(méi)有替換掉默認管理器,那么默認管理器需要顯式的聲明出來(lái)才可以使用。
Django中查詢(xún)queryset時(shí)什么情況下用Q?
在進(jìn)行相對復雜的查詢(xún)時(shí),使用django.db.models.Q對象。
例如需要進(jìn)行復合條件的查詢(xún)的SQL語(yǔ)句如下:
SELECT * FROM order WHERE id BETWEEN 20 ADN 100 AND(num <= '20' or num >= '30');
使用Q就可以寫(xiě)成:
from django.db.models import Q
from login.models import Order
#...
Order.objects.get(
Q(id >= 20) & (id <= 100),
Q(num <= 20) | (num >= 30)
)
Django中想驗證表單提交是否格式正確需要用到Form中的哪個(gè)函數?
is_valid()函數方法,用于檢查表單提交是否正確。
Django取消級聯(lián)刪除
這個(gè)文檔寫(xiě)的比較清楚:
user = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL)
并且SET_NULL只有在null為T(mén)rue的時(shí)候,才可以使用。
Django中如何在Model保存前做一定的固定操作,比如寫(xiě)一句日志?
關(guān)鍵詞: 信號
利用Django的Model的Signal Dispatcher, 通過(guò)django.db.models.signals.pre_save()方法,在事件發(fā)生前,發(fā)射觸發(fā)信號,這一切都被調度中的receiver方法深藏功與名的保存了。
信號的處理一般都寫(xiě)在Model中,舉個(gè)例子:
import logging
from django.db import models
from django.db.models.signals import pre_save
from django.dispatch import receiver
class Order(models.Model):
# ...
logger = logging.getLogger(__name__)
@receiver(pre_save, sender=Order)
def pre_save_handler(sender, **kwargs):
# 我們可以在Order這個(gè)Model保存之前盡情調戲了:)
logger.debug("{},{}".format(sender, **kwargs))
print 'fuck universe'
這樣應該就實(shí)現了題中的要求,類(lèi)似的方法還有比如pre_init是在Model實(shí)例之前會(huì )觸發(fā),post_init在實(shí)例之后觸發(fā),同理就是pre_save和post_save了。
【刻苦銘心的公開(kāi)課作文200字】相關(guān)文章:
勤奮刻苦的作文12-03
刻苦勤奮的作文08-13
刻苦勤奮的作文09-02
刻苦的軍訓05-05
刻苦勤奮的作文【通用】01-29
刻苦勤奮的作文(精)12-14
(集合)勤奮刻苦的作文06-15
【熱門(mén)】刻苦勤奮的作文04-12
刻苦勤奮的作文(合集)07-09
刻苦勤奮的作文(集合)11-24
- 相關(guān)推薦