ããModelæ¯django项ç®çåºç¡, å¦æä¸å¼å§æ²¡æ好好设计好, é£ä¹å¨æ¥ä¸æ¥çå¼åè¿ç¨ä¸å°±ä¼éå°æ´å¤çé®é¢. ç¶è, 大å¤æ°çå¼å人åé½å®¹æå¨ç¼ºå°æè çæ åµä¸éæçå¢å æä¿®æ¹model. è¿æ ·åçåæå°±æ¯, å¨æ¥ä¸æ¥çå¼åè¿ç¨ä¸, æ们ä¸å¾ä¸ååºæ´å¤åªåæ¥ä¿®æ£è¿äºé误.
ããå æ¤, å¨ä¿®æ¹modelæ¶, ä¸å®å°½å¯è½çç»è¿å åçèèåè¡å¨! 以ä¸ååºçæ¯æ们ç»å¸¸ç¨å°çä¸äºå·¥å ·åæå·§:
ããSouth, ç¨äºæ°æ®è¿ç§», æ们ä¼å¨æ¯ä¸ªdjango项ç®ä¸é½ç¨å°. ä½å°django 1.7æ¶, å°ä¼ædjango.db.migrations代æ¿.
ããdjango-model-utils, ç¨äºå¤ç常è§ç模å¼, ä¾å¦TimeStampedModel.
ããdjango-extensions, 主è¦ç¨å°shell_pluså½ä»¤, 该å½ä»¤ä¼å¨shellä¸èªå¨è½½å ¥ææçappçmodel
ãã1. åºæ¬åå
ãã第ä¸, å°modelåå¸äºä¸åçappä¸. å¦æä½ çdjango项ç®ä¸, æä¸ä¸ªappæ¥æè¶ è¿20个model, é£ä¹, ä½ å°±åºå½èèåæ该appäº. æ们æ¨èæ¯ä¸ªappæ¥ æä¸è¶ è¿5个model.
ãã第äº, å°½é使ç¨ORM. æ们éè¦ç大å¤æ°æ°æ®åºç´¢å¼é½è½éè¿Object-Relational-Modelå®ç°, ä¸ORM带ç»æ们许å¤å¿«æ·æ¹å¼, ä¾å¦çæSQLè¯å¥, 读å/æ´æ°æ°æ®åºæ¶çå®å ¨éªè¯. å æ¤, å¦æè½ä½¿ç¨ç®åçORMè¯å¥å®æç, åºå½å°½é使ç¨ORM. åªæå½çº¯SQLè¯å¥æ大å°ç®åäºORMè¯å¥æ¶, æ使ç¨çº¯SQLè¯å¥. 并ä¸, å¨å纯SQLè¯å¥æ¯, åºå½ä¼å èè使ç¨raw(), åæ¯extra().
ãã第ä¸, å¿ è¦æ¶æ·»å index. æ·»å db_index=Trueå°modelä¸é常ç®å, ä½é¾çæ¯ç解ä½æ¶åºè¯¥æ·»å . å¨å»ºç«modelæ¶, æ们äºå ä¸ä¼æ·»å index, åªæå½ ä»¥ä¸æ åµæ¶, æä¼èèæ·»å index:
ããå¨ææçæ°æ®åºæ¥è¯¢ä¸ä½¿ç¨çå¨10%-25%æ¶
ããæå½æçå®çæ°æ®, æè½æ£ç¡®ä¼°è®¡åºä½¿ç¨indexåçææç¡®å®æ»¡ææ¶
ãã第å, 注æmodelç继æ¿. modelç继æ¿å¨djangoä¸éè¦ååå°å¿, djangoæä¾äºä¸ç§ç»§æ¿æ¹å¼, 1.abstract base class继æ¿(ä¸è¦åPyhtonæ ååºçabc模å ææ··), 2.å¤è¡¨(multi-table)继æ¿, 3.proxy model继æ¿. ä¸è¡¨ç½åäºè¿ä¸ç§ç»§æ¿çä¼å£:
ããdjangoçåé è åå ¶ä»è®¸å¤å¼å人åé½è®¤ä¸º, å¤è¡¨ç»§æ¿çæ¹æ³ä¸æ¯ä¸ä¸ªè¯å¥½çæ¹æ³. å æ¤æ们强ç建议大家ä¸è¦ä½¿ç¨è¯¥æ¹æ³. ä¸é¢å举äºä¸äºå¸¸è§çå¦ä½ éæ©model继æ¿çæ å½¢:
ããå¦æåªæå°æ°modelæ¥æéå¤çfieldæ¶, 大å¯ä¸å¿ 使ç¨model继æ¿, åªéè¦å¨æ¯ä¸ªmodelä¸æ·»å è¿äºç¸åçfieldå³å¯.
ããå¦ææ足å¤çmodelæ¥æéå¤çfieldæ¶, 大å¤æ¯æ åµä¸, å¯ä»¥ä½¿ç¨abstract base class继æ¿, å°ç¸åçfieldæåå°abstract base class ä¸.
ããProxy model继æ¿å¾å°è¢«ç¨å°, åå ¶ä»ä¸¤ç§ç»§æ¿ä¹æç许å¤ä¸ä¸æ ·ä¹å¤.
ãã请ä¸è¦ä½¿ç¨å¤è¡¨(multi-table)继æ¿, å 为å®æ¢æ¶èèµæºåå¤æ, å¦æå¯ä»¥, å°½é使ç¨OneToOneFieldsåForeignKeys代æ¿.
ããdjango项ç®ä¸, å建æ¶é´åä¿®æ¹æ¶é´è¿ä¸¤ä¸ªfieldæ¯æç¨å°ç, ä¸é¢ç»åºä¸ä¸ªabstract base class继æ¿çä¾å:
ãã2. Django Modelç设计
ããå¦ä½è®¾è®¡åºå¥½çdjango modelå¯è½æ¯æé¾ä¹æ¯æå¤æçä¸ä¸ªè¯é¢äº, å¨æ¤, æ们ççä¸äºåºæ¬çæå·§å§:
ããa. è§èå
ããæ们é¦å 建议äºè§£æ°æ®åºè§èå(database normalization). å¦æä½ è¿ä¸æ¸ æ¥è¿æ¯ä»ä¹, é£ä¹, æ们强çå»ºè®®ä½ å é 读ä¸ä¸ç¸å ³ç书ç±, ææç´¢"å ³ç³» åæ°æ®åºè®¾è®¡"æ"æ°æ®åºè§èå". å¨å建django modelä¹å, åºå½é¦å ä¿è¯è®¾è®¡çæ°æ®åºæ¯è§èåç.
ããb. cache
ããæ£ç¡®ç使ç¨cacheè½å¸®å©æ们æé«æ°æ®åºçæ§è½. 详ç»çä¿¡æ¯, æ们ä¼å¨ä»åçæç« ä¸ä½è¿ä¸æ¥ä»ç».
ããc. ä½æ¶ä½¿ç¨nullåblank
ããå½å®ä¹model fieldæ¶, æ们å¯ä»¥è®¾ç½®null=Trueåblank=True (é»è®¤é½æ¯False), ç¥éä½æ¶è®¾ç½®nullåblank对äºå¼å人åä¹æ¯ååéè¦ç, å¨ä¸ é¢çè¡¨æ ¼ä¸, æ们ä¸ä¸å举äºå¦ä½ä½¿ç¨è¿ä¸¤ä¸ªé项:
ããd. ä»ä¹æ¶å使ç¨BinaryField
ããå¨django 1.6ä¸, æ°å¢äºBinaryField, ç¨äºå¨åäºè¿å¶æ°æ®(binary dataæ bytes). 对äºBinaryField, æ们æ æ³ä½¿ç¨ORMçfilters, excludesæå ¶ä»SQLæä½. ä½å¨å°æ°æ åµä¸, æ们ä¼ç¨å°BinaryField, ä¾å¦MessagePackæ ¼å¼çå 容, ä¼ æå¨æ¥åçåå§æ°æ®åå缩æ°æ®ç. ä½éè¦æ³¨æ çæ¯, Binary Dataä¸è¬é½åååºå¤§, å æ¤å¯è½ä¼ææ ¢æ°æ®åºçé度. å¦æåçè¿ä¸ç°è±¡, æ们å¯ä»¥å°binary dataå¨åå¨æ件ä¸, ç¶å使ç¨FileFieldå¨ å该æ件çè·¯å¾ä¿¡æ¯.
ããè¿æ, ä¸è¦ä»BinaryFieldä¸ç´æ¥è¯»åæ件并åç®ç»ç¨æ·. å 为, 1. ä»æ°æ®åºè¯»åæ»æ¯æ¯ä»æ件系ç»è¯»åæ ¢; 2. æ°æ®åºå¤ä»½ä¼åå¾åååºå¤§, è±è´¹æ´å¤ çæ¶é´; 3. è·å¾æ件çè¿ç¨, å¢å äºä»djangoå°æ°æ®åºçè¿ä¸ç¯è.
ãã3. ä¸è¦æ¿æ¢é»è®¤çModel Manager
ããä»ORMè·åmodel, å®é ä¸æ¯éè¿djangoä¸çModel managerå®æç, django为æ¯ä¸ä¸ªmodelæä¾äºé»è®¤çmodel manager, æ们ä¸å»ºè®®å°å ¶æ¿æ¢æ, å 为:
ããå½ä½¿ç¨model继æ¿æ¶, modelä¼ç»§æ¿ abstract base class modelçmodel manager, èä¸ä¼ç»§æ¿éabstract base classçmanager.
ããmodelç第ä¸ä¸ªmodel manageré常ä½ä¸ºé»è®¤çmanager, å½è¢«æ¿æ¢æ¶, å¯è½ä¼åçä¸å¯é¢æµçé®é¢.
ãã4. æ°æ®åºäºå¡ (Transaction)
ããå¨django 1.6ä¸, ORMé»è®¤ä¼autocommitæ¯ä¸ä¸ªæ°æ®åºæ¥è¯¢, ä¹å°±æ¯è¯´, æ¯æ¬¡ä½¿ç¨m.create()æm.update()æ¶, å¨æ°æ®åºä¸é©¬ä¸å°±ä¼ååºç¸åºçä¿® æ¹. è¿æ ·åç好å¤å°±æ¯ç®åäºåå¦è 对ORMçç解. ä½åå¤å°±æ¯, å½ä¸ä¸ªviewä¸å å«ä¸¤ä¸ªæ°æ®åºä¿®æ¹, å¯è½ä¸ä¸ªæå, ä½å¦ä¸ä¸ªå¤±è´¥, è¿å°±å¯è½å¯¼è´æ°æ®åºä¸ å®æ´, ç»æ们带æ¥å¾å¤§çå±é©.
ãã解å³è¿ä¸é®é¢çæ¹æ³å°±æ¯ä½¿ç¨æ°æ®åºtransaction, å³å°ä¸ç³»åæ°æ®åºæä½å å«å¨ä¸ä¸ªtransactionä¸, å½å ¶ä¸æä¸ä¸ªå¤±è´¥æ¶, å ¶ä»æä½ä¹ä¼èªå¨åé. Django 1.6 为æ们带æ¥äºä¸å¥å´æ°çæ¢ç®åå强大çtransactionæºå¶, 使æ们æ¹ä¾¿ç使ç¨æ°æ®åºtransaction.
ããa. å°æ´ä¸ªhttp requestå 裹å¨transactionä¸
ããdjangoç»æ们æä¾äºä¸ä¸ªç®åå°æ¹æ³, å°ä¸ä¸ªhttp requestä¸çæææ°æ®åºæä½å 裹å¨transactionä¸:
ããåªéè¦å¨æ°æ®åºè®¾ç½®ä¸å å ¥'ATOMIC_REQUESTS': Trueé项, å°±è½å°æ´ä¸ªhttp requestå 裹å¨transactionä¸. è¿æ ·åç好å¤æ¾èæè§æ¯æ¯å®å ¨, ä½ åå¤åæ¯æ§è½å¯è½ä¼ä¸é, å æ¤éçæµéçå¢å¤§, æä»¬å¿ é¡»éåæ´é对æ§çtransaction. å ¶æ¬¡, éè¦æ³¨æçæ¯, åéçåªæ¯æ°æ®åºçç¶æ, èä¸å æ¬å ¶ä»è´¹ æ°æ®åºé¡¹, ä¾å¦åéemailç. æ以å½æ¶åè¿äºéæ°æ®åºé¡¹æ¶, æ们åºå½ä½¿ç¨transaction.con_atomic_request()修饰(decorate)è¿äºview:
ããb. æ´æç¡®å°transactionæ§å¶
ããæ´æç¡®å°transactionæ§å¶æå³çæé«çé¢web appçæ§è½, ä½ä¹æå³çæ´å¤çå¼åæ¶é´. 大å¤æ°ç½ç«ä¸, ç±äºæéçæµé, 使ç¨ATOMIC_REQUESTSå·² ç»è¶³å¤. å¨ä½¿ç¨æå¨transactionæ§å¶æ¶, åºå½æ³¨æ:
ããä¸åæ°æ®ä¿®æ¹çæä½, åºå½æé¤å¨transactionä¹å¤
ããåæ°æ®ä¿®æ¹çæä½, ååºå¨transactionå
ããç¹æ®æ åµä¸, å¯ä»¥è¿å以ä¸ä¸¤æ¡
ããéè¦æ³¨æçæ¯, å½viewè¿åçæ¯django.http.StreamingHttpResponseæ¶, åºå½è®¾ç½®ATOMIC_REQUESTS为false, æä½¿ç¨ transaction.non_atomic_requestså°è¯¥view修饰. å 为对äºviewæ¬èº«, æ¯å¯ä»¥ä½¿ç¨transactionç, ä½å¯¹äºä¹åçæçresponse stream触åçé¢ å¤SQLæ¥è¯¢, ä¼èªå¨å为djangoé»è®¤çautocommit模å¼.
ããè½¬è½½ä» ä¾åèï¼çæå±äºåä½è ãç¥ä½ æå¿«ï¼æ»¡æ请é纳å¦