1. 程式人生 > >Django補充

Django補充

hook -a oca ted 了解 bin 多數據庫 manager 好用

1.Django ORM def __unicode__
類似 _str__ 方法,多為python2情況下使用


2.
models.Manager:自定義manager以定制數據庫訪問,默認manager會有get_query_set()方法,
它返回為默認的查詢 objects 即 models.objects.all() 可以重寫此方法達到查詢指定數據的作用

from django.db import models

**# First, define the Manager subclass.**
**class DahlBookManager(models.Manager):**
**def get_query_set(self):**
**return super(DahlBookManager, self).get_query_set().filter(author=‘Roald Dahl‘)**

**# Then hook it into the Book model explicitly.**
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
# ...

**objects = models.Manager() # The default manager.**
**dahl_objects = DahlBookManager() # The Dahl-specific manager.**

在這個示例模型中,Book.objects.all()返回了數據庫中的所有書本,而Book.dahl_objects.all()只返回了一本.
註意我們明確地將objects設置成manager的實例,因為如果我們不這麽做,那麽唯一可用的manager就將是dah1_objects

3.
class meta:
abstract 是否抽象類(是否生成):
這個屬性是定義當前的模型類是不是一個抽象類。所謂抽象類是不會對應數據庫表的。一般我們用它來歸納一些公共屬性字段,
然後繼承它的子類可以繼承這些字段。比如下面的代碼中Human是一個抽象類,Employee是一個繼承了Human的子類,
那麽在運行syncdb命令時,不會生成Human表,但是會生成一個Employee表,它包含了Human中繼承來的字段,以後如果再添加一個Customer模型類,
它可以同樣繼承Human的公共屬性:


4.
自定義方法:models中可以使用各種自定義的方法,執行對數據的對應操作:

技術分享
為了給你的對像添加一個行級功能,那就定義一個自定義方法。 有鑒於manager經常被用來用一些整表操作(table-wide),模型方法應該只對特殊模型實例起作用。
這是一項在模型的一個地方集中業務邏輯的技術。
最好用例子來解釋一下。 這個模型有一些自定義方法:
from django.contrib.localflavor.us.models import USStateField
from django.db import models

class Person(models.Model):
  first_name = models.CharField(max_length=50)
  last_name 
= models.CharField(max_length=50) birth_date = models.DateField() address = models.CharField(max_length=100) city = models.CharField(max_length=50) state = USStateField() # Yes, this is U.S.-centric... def baby_boomer_status(self): "Returns the person‘s baby-boomer status." import datetime if datetime.date(1945, 8, 1) <= self.birth_date <= datetime.date(1964, 12, 31): return "Baby boomer" if self.birth_date < datetime.date(1945, 8, 1): return "Pre-boomer" return "Post-boomer" def is_midwestern(self): "Returns True if this person is from the Midwest." return self.state in (IL, WI, MI, IN, OH, IA, MO) def _get_full_name(self): "Returns the person‘s full name." return u%s %s % (self.first_name, self.last_name) full_name = property(_get_full_name) 例子中的最後一個方法是一個property。 想了解更多關於屬性的信息請訪問http://www.python.org/download/releases/2.2/descrintro/#property 這是用法的實例: >>> p = Person.objects.get(first_name=Barack, last_name=Obama) >>> p.birth_date datetime.date(1961, 8, 4) >>> p.baby_boomer_status() Baby boomer >>> p.is_midwestern() True >>> p.full_name # Note this isn‘t a method -- it‘s treated as an attribute uBarack Obama
View Code


5.
settings中:(多數據庫使用)
DATABASE_ROUTERS = [‘cpapi.router.DefaultRouter‘,] 可以設置多個數據庫連接,優先級從左到右
db_for_read(model, **hints)
建議 model 對象寫操作時使用的數據庫。

如果一個數據庫操作可以提供對選擇數據庫有用的附加信息,那麽可以通過 hints 字典提供。詳見 下文 。

如果沒有建議則返回 None 。

db_for_write(model, **hints)
建議 model 對象讀操作時使用的數據庫。

如果一個數據庫操作可以提供對選擇數據庫有用的附加信息,那麽可以通過 hints 字典提供。詳見 下文 。

如果沒有建議則返回 None 。

allow_relation(obj1, obj2, **hints)
當 obj1 和 obj2 之間允許有關系時返回 True ,不允許時返回 False ,或者沒有 意見時返回 None 。這是一個純粹的驗證操作,用於外鍵和多對多操作中,兩個對象 的關系是否被允許。

allow_syncdb(db, model)
決定 model 是否可以和 db 為別名的數據庫同步。如果可以返回 True , 如果不可以返回 False ,或者沒有意見時返回 None 。這個方法用於決定一個給定 數據庫的模型是否可用。
一個路由不必提供 所有 這些方法,可以省略其中一個或多個。如果其中一個方法被 省略了,那麽 Django 會在執行相關檢查時跳過相應路由。


6.
實現自定義的manage命令:
django-admin.py調用django.core.management來執行命令:
#!/usr/bin/env python
from django.core import management

if __name__ == "__main__":
management.execute_from_command_line()

excute_from_command_line()函數會根據命令行參數解析出命令的名稱,根據命令名稱調用相應的Command執行命令。Command位於各個管理模塊的commands模塊下面。

所謂管理模塊,是指在app模塊下的名字為management的模塊。Django通過django.core.management.find_management_module函數發現"管理模塊":

然後通過django.core.management.find_commands函數找到命令類。find_commands函數會在管理模塊下查找.py文件,並將.py文件的名稱匹配到命令名稱:
最後,通過django.core.management.load_command_class函數加載該.py文件中的Command類:

在執行命令的時候,會執行相應Command類的handle方法。所有的Command類都應該是django.core.management.base.BaseCommand的直接或間接子類。

原理搞清楚了,擴展manage命令就很容易了。創建一個app並加入到settings的INSTALLED_APPS中,在該app下面創建management.commands模塊,並創建hello.py文件:
from django.core.management.base import BaseCommand, CommandError
from django.db import models
#from placeholders import *
import os

class Command(BaseCommand):
def handle(self, *args, **options):
print ‘hello, django!‘
復制代碼
就可以使用hello命令了:

$ python manage.py hello
hello, django!

Django補充