电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

django queryset 去重 .distinct()說明

瀏覽:91日期:2024-10-03 17:16:08

我就廢話不多說了,大家還是直接看代碼吧!

contacts = ExternalContacts.objects.filter(MobileKey=mobile_obj) house = House.objects.none() for contact in contacts: house = house | contact.house_set.all() return house.distinct()

合并出來的queryset,再去重。

補(bǔ)充知識(shí):Python——深入理解urllib、urllib2及requests(requests不建議使用?)

Python 是一種面向?qū)ο蟆⒔忉屝陀?jì)算機(jī)程序設(shè)計(jì)語言,由Guido van Rossum于1989年底發(fā)明,第一個(gè)公開發(fā)行版發(fā)行于1991年,Python 源代碼同樣遵循 GPL(GNU General Public License)協(xié)議[1] 。Python語法簡(jiǎn)潔而清晰,具有豐富和強(qiáng)大的類庫。

urllib and urllib2 區(qū)別

urllib和urllib2模塊都做與請(qǐng)求URL相關(guān)的操作,但他們提供不同的功能。

urllib2.urlopen accepts an instance of the Request class or a url, (whereas urllib.urlopen only accepts a url 中文意思就是:urllib2.urlopen可以接受一個(gè)Request對(duì)象或者url,(在接受Request對(duì)象時(shí)候,并以此可以來設(shè)置一個(gè)URL 的headers),urllib.urlopen只接收一個(gè)url

urllib 有urlencode,urllib2沒有,這也是為什么總是urllib,urllib2常會(huì)一起使用的原因

r = Request(url=’http://www.mysite.com’)r.add_header(’User-Agent’, ’awesome fetcher’)r.add_data(urllib.urlencode({’foo’: ’bar’})response = urllib2.urlopen(r) #post method

urllib 模塊

I. urlencode不能直接處理unicode對(duì)象,所以如果是unicode,需要先編碼,有unicode轉(zhuǎn)到utf8,舉例:

urllib.urlencode (u’bl’.encode(’utf-8’))

II. 示例

import urllib #sohu 手機(jī)主頁 url = ’http://m.sohu.com/?v=3&_once_=000025_v2tov3&_smuid= ICvXXapq5EfTpQTVq6Tpz’ resp = urllib.urlopen(url) page = resp.read() f = open(’./urllib_index.html’, ’w’) f.write(page) print dir(resp)

結(jié)果:

[’doc’, ’init’, ’iter’, ’module’, ’repr’, ’close’, ’code’, ’fileno’, ’fp’, ’getcode’, ’geturl’, ’headers’, ’info’, ’next’, ’read’, ’readline’, ’readlines’, ’url’]

print resp.getcode(), resp.geturl(), resp.info(), resp.headers, resp.url#resp.url和resp.geturl()結(jié)果一樣

III. 編解碼示例 urllib.quote和urllib.urlencode都是編碼,但用法不一樣

s = urllib.quote(’This is python’) #編碼 print ’quote:t’+s #空格用%20替代 s_un = urllib.unquote(s) #解碼 print ’unquote:t’+s_un s_plus = urllib.quote_plus(’This is python’) #編碼 print ’quote_plus:t’+s_plus #空格用+替代 s_unplus = urllib.unquote_plus(s_plus) #解碼 print ’s_unplus:t’+s_unplus s_dict = {’name’: ’dkf’, ’pass’: ’1234’} s_encode = urllib.urlencode(s_dict) #編碼字典轉(zhuǎn)換成url參數(shù) print ’s_encode:t’+s_encode

結(jié)果:

quote: This%20is%20python unquote: This is python quote_plus: This+is+python s_unplus: This is python s_encode: name=dkf&pass=1234

IV. urlretrieve() urlretrieve多數(shù)適用單純的只下載的功能或者顯示下載的進(jìn)度等

url = ’http://m.sohu.com/?v=3&_once_=000025_v2tov3&_ smuid=ICvXXapq5EfTpQTVq6Tpz’urllib.urlretrieve(url, ’./retrieve_index.html’) #直接把url鏈接網(wǎng)頁內(nèi)容下載到retrieve_index.html里了,適用于單純的下載的功能。 #urllib.urlretrieve(url, local_name, method)

urllib2

I. urllib2模塊定義的函數(shù)和類用來獲取URL(主要是HTTP的),他提供一些復(fù)雜的接口用于處理: 基本認(rèn)證,重定向,Cookies等。

II. 常用方法和類 II.1 urllib2.urlopen(url[, data][, timeout]) #傳url時(shí)候,用法同urllib里的urlopen

II.1.1 它打開URL網(wǎng)址,url參數(shù)可以是一個(gè)字符串url或者是一個(gè)Request對(duì)象。可選的參數(shù)timeout,阻塞操作以秒為單位,如嘗試連接(如果沒 有指定,將使用設(shè)置的全局默認(rèn)timeout值)。實(shí)際上這僅適用于HTTP,HTTPS和FTP連接。

url = ’http://m.sohu.com/?v=3&_once_=000025_v2tov3&_smuid=ICvXXapq5EfTpQTVq6Tpz’resp = urllib2.urlopen(url)87 page = resp.read()

II.1.2 urlopen方法也可通過建立了一個(gè)Request對(duì)象來明確指明想要獲取的url。調(diào)用urlopen函數(shù)對(duì)請(qǐng)求的url返回一個(gè)response對(duì) 象。這個(gè)response類似于一個(gè)file對(duì)象,所以用.read()函數(shù)可以操作這個(gè)response對(duì)象

url = ’http://m.sohu.com/?v=3&_once_=000025_v2tov3&_smuid =ICvXXapq5EfTpQTVq6Tpz’ req = urllib2.Request(url) resp = urllib2.urlopen(req) page = resp.read()

II.2 class urllib2.Request(url[, data][, headers][, originreqhost][, unverifiable])

II.2.1 Request類是一個(gè)抽象的URL請(qǐng)求。

5個(gè)參數(shù)的說明如下:

II.2.1.1 URL——是一個(gè)字符串,其中包含一個(gè)有效的URL。

II.2.1.2 data——是一個(gè)字符串,指定額外的數(shù)據(jù)發(fā)送到服務(wù)器,如果沒有data需要發(fā)送可以為“None”。目前使用data的HTTP請(qǐng)求是唯一的。當(dāng)請(qǐng)求 含有data參數(shù)時(shí),HTTP的請(qǐng)求為POST,而不是GET。數(shù)據(jù)應(yīng)該是緩存在一個(gè)標(biāo)準(zhǔn)的application/x-www-form- urlencoded格式中。urllib.urlencode()函數(shù)用映射或2元組,返回一個(gè)這種格式的字符串。通俗的說就是如果想向一個(gè)URL發(fā)送 數(shù)據(jù)(通常這些數(shù)據(jù)是代表一些CGI腳本或者其他的web應(yīng)用)。例如在網(wǎng)上填的form(表單)時(shí),瀏覽器會(huì)POST表單的內(nèi)容,這些數(shù)據(jù)需要被以標(biāo)準(zhǔn) 的格式編碼(encode),然后作為一個(gè)數(shù)據(jù)參數(shù)傳送給Request對(duì)象。Encoding是在urlib模塊中完成的,而不是在urlib2中完成 的。下面是個(gè)例子:

import urllibimport urllib2url = ’http://www.someserver.com/cgi-bin/register.cgi’values = {’name’ : ’Michael Foord’, ’location’ : ’Northampton’, ’language’ : ’Python’ }data = urllib.urlencode(values) req = urllib2.Request(url, data) #send postresponse = urllib2.urlopen(req)page = response.read()

II.2.1.3 headers——是字典類型,頭字典可以作為參數(shù)在request時(shí)直接傳入,也可以把每個(gè)鍵和值作為參數(shù)調(diào)用add_header()方法來添加。

作 為辨別瀏覽器身份的User-Agent header是經(jīng)常被用來惡搞和偽裝的,因?yàn)橐恍〩TTP服務(wù)只允許某些請(qǐng)求來自常見的瀏覽器而不是腳本,或是針對(duì)不同的瀏覽器返回不同的版本。

例 如,Mozilla Firefox瀏覽器被識(shí)別為“Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11”。默認(rèn)情況下,urlib2把自己識(shí)別為Python-urllib/x.y(這里的xy是python發(fā)行版的主要 或次要的版本號(hào),如在Python 2.6中,urllib2的默認(rèn)用戶代理字符串是“Python-urllib/2.6。

下面的例子和上面的區(qū)別就是在請(qǐng)求時(shí)加了一個(gè)headers,模 仿IE瀏覽器提交請(qǐng)求。

import urllibimport urllib2url = ’http://www.someserver.com/cgi-bin/register.cgi’user_agent = ’Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)’values = {’name’ : ’Michael Foord’, ’location’ : ’Northampton’, ’language’ : ’Python’ }headers = { ’User-Agent’ : user_agent }data = urllib.urlencode(values)req = urllib2.Request(url, data, headers)response = urllib2.urlopen(req)the_page = response.read()

標(biāo)準(zhǔn)的headers組成是(Content-Length, Content-Type and Host),只有在Request對(duì)象調(diào)用urlopen()(上面的例子也屬于這個(gè)情況)或者OpenerDirector.open()時(shí)加入。

兩種 情況的例子如下: 使用headers參數(shù)構(gòu)造Request對(duì)象,如上例在生成Request對(duì)象時(shí)已經(jīng)初始化header,而下例是Request對(duì)象調(diào)用 add_header(key, val)方法附加header(Request對(duì)象的方法下面再介紹):

import urllib2req = urllib2.Request(’http://www.example.com/’)req.add_header(’Referer’, ’http://www.python.org/’) #http是無狀態(tài)的協(xié)議,上一次客戶端的請(qǐng)求與下一次客戶端到服務(wù)器的請(qǐng)求無關(guān)系的,多數(shù)省略這一步r = urllib2.urlopen(req)

OpenerDirector為每一個(gè)Request自動(dòng)加上一個(gè)User-Agent header,所以第二種方法如下(urllib2.buildopener會(huì)返回一個(gè)OpenerDirector對(duì)象,關(guān)于urllib2.buildopener類下面再說):

import urllib2opener = urllib2.build_opener()opener.addheaders = [(’User-agent’, ’Mozilla/5.0’)]opener.open(’http://www.example.com/’)

II.3 urllib2.installopener(opener)和urllib2.buildopener([handler, ...]) 

installopener和buildopener這兩個(gè)方法通常都是在一起用,也有時(shí)候buildopener單獨(dú)使用來得到OpenerDirector對(duì)象。

installopener 實(shí)例化會(huì)得到OpenerDirector 對(duì)象用來賦予全局變量opener。如果想用這個(gè)opener來調(diào)用urlopen,那么就必須實(shí)例化得到OpenerDirector;這樣就可以簡(jiǎn)單 的調(diào)用OpenerDirector.open()來代替urlopen()。

build_opener實(shí)例化也會(huì)得到 OpenerDirector對(duì)象,其中參數(shù)handlers可以被BaseHandler或他的子類實(shí)例化。子類中可以通過以下實(shí)例 化:ProxyHandler (如果檢測(cè)代理設(shè)置用)掃描代理會(huì)用到,很重要這個(gè), UnknownHandler, HTTPHandler, HTTPDefaultErrorHandler, HTTPRedirectHandler, FTPHandler, FileHandler, HTTPErrorProcessor。

import urllib2req = urllib2.Request(’http://www.python.org/’)opener=urllib2.build_opener()urllib2.install_opener(opener)f = opener.open(req)

如上使用 urllib2.install_opener()設(shè)置 urllib2 的全局 opener。這樣后面的使用會(huì)很方便,但不能做更細(xì)粒度的控制,比如想在程序中使用兩個(gè)不同的 Proxy 設(shè)置等。

比較好的做法是不使用 install_opener 去更改全局的設(shè)置,而只是直接調(diào)用 opener的open 方法代替全局的 urlopen 方法。

說到這Opener和Handler之間的操作聽起來有點(diǎn)暈。整理下思路就清楚了。

當(dāng)獲取一個(gè)URL時(shí),可以使用一 個(gè)opener(一個(gè)urllib2.OpenerDirector實(shí)例對(duì)象,可以由build_opener實(shí)例化生成)。

正常情況下程 序一直通過urlopen使用默認(rèn)的opener(也就是說當(dāng)你使用urlopen方法時(shí),是在隱式的使用默認(rèn)的opener 對(duì)象),但也可以創(chuàng)建自定義的openers(通過操作 器handlers創(chuàng)建的opener實(shí)例)。

所有的重活和麻煩 都交給這些handlers來做。

每一個(gè)handler知道如何以一種特定的協(xié)議(http,ftp等等)打開url,或 者如何處理打開url發(fā)生的HTTP重定向,或者包含的HTTP cookie。

創(chuàng)建openers時(shí)如果想要安裝特別的han dlers來實(shí)現(xiàn)獲取url(如獲取一個(gè)處理cookie的opener,或者一個(gè)不處理重定向的opener)的話,先實(shí)例 一個(gè)OpenerDirector對(duì)象,然后多次調(diào)用.add_handler(some_handler_instance)來創(chuàng)建一個(gè)opene r。

或者,你可以用build_opener,這是一個(gè)很方便的創(chuàng)建opener對(duì)象的函數(shù),它只有一個(gè)函數(shù)調(diào)用 。

build_opener默認(rèn)會(huì)加入許多handlers,它提供了一個(gè)快速的方法添加更多東西和使默認(rèn)的handler 失效。

install_opener如上所述也能用于創(chuàng)建一個(gè)opener對(duì)象,但是這個(gè)對(duì)象是(全局)默認(rèn)的opener。

這意味著調(diào)用urlopen 將會(huì)用到你剛創(chuàng)建的opener。

也就是說上面的代碼可以等同于下面這段。這段代碼最終還是使用的默認(rèn)opener。

一般情況下我們用 build_opener為的是生成自定義opener,沒有必要調(diào)用install_opener,除非是為了方便。

import urllib2req = urllib2.Request(’http://www.python.org/’)opener=urllib2.build_opener() # 創(chuàng)建opener對(duì)象urllib2.install_opener(opener) #定義全局默認(rèn)openerf = urllib2.urlopen(req) #urlopen使用默認(rèn)opener,但是install_opener #已經(jīng)把opener設(shè)為全局默認(rèn)了,這里便是使用上面的建立的opener

III. 異常處理//www.jb51.net/article/63711.htm當(dāng)我們調(diào)用urllib2.urlopen的時(shí)候不會(huì)總是這么順利,就像瀏覽器打開url時(shí)有時(shí)也會(huì)報(bào) 錯(cuò),所以就需要我們有應(yīng)對(duì)異常的處理。說到異常,我們先來了解返回的response對(duì)象的 幾個(gè)常用的方法:

geturl() — 返回檢索的URL資源,這個(gè)是返回的真正url,通常是用來鑒定是否重定向的

info() — 返回頁面的原信息就像一個(gè)字段的對(duì)象, 如headers,它以mimetools.Message實(shí)例為格式(可以參考HTTP Headers說明)。

getcode() — 返回響應(yīng)的HTTP狀態(tài)代碼,運(yùn)行下面代碼可以得到code=200 當(dāng)不能處理一個(gè)response時(shí),urlopen拋出一個(gè)URLError(對(duì)于python APIs,內(nèi)建異常如,ValueError, TypeError 等也會(huì)被拋出。)

HTTPError是HTTP URL在特別的情況下被拋出的URLError的一個(gè)子類。下面就詳細(xì)說說URLError和HTTPError。 URLError——handlers當(dāng)運(yùn)行出現(xiàn)問題時(shí)(通常是因?yàn)闆]有網(wǎng)絡(luò)連接也就是沒有路由到指定的服務(wù)器,或在指定的服務(wù)器不存在)

HTTPError——HTTPError是URLError的子類。每個(gè)來自服務(wù)器HTTP的response都包含“status code”. 有時(shí)status code不能處理這個(gè)request. 默認(rèn)的處理程序?qū)⑻幚磉@些異常的responses。例如,urllib2發(fā)現(xiàn)response的URL與你請(qǐng)求的URL不同時(shí)也就是發(fā)生了重定向時(shí),會(huì) 自動(dòng)處理。對(duì)于不能處理的請(qǐng)求, urlopen將拋出 - - - HTTPError異常. 典型的錯(cuò)誤包含‘404’ (沒有找到頁面), ‘403’ (禁止請(qǐng)求),‘401’ (需要驗(yàn)證)等。它包含2個(gè)重要的屬性reason和code。

程序?qū)τ谥囟ㄏ驎r(shí)默認(rèn)處理的

總結(jié)

如果只是單純的下載或者顯示下載進(jìn)度,不對(duì)下載后的內(nèi)容做處理等,比如下載圖片,css,js文件等,可以用urlilb.urlretrieve()

如果是下載的請(qǐng)求需要填寫表單,輸入賬號(hào),密碼等,建議用urllib2.urlopen(urllib2.Request())

在對(duì)字典數(shù)據(jù)編碼時(shí)候,用到的是urllib.urlencode()

requests

I. Requests 使用的是 urllib3,繼承了urllib2的所有特性。Requests支持HTTP連接保持和連接池,支持使用cookie保持會(huì)話,支持文件上傳,支持自 動(dòng)確定響應(yīng)內(nèi)容的編碼,支持國(guó)際化的 URL 和 POST 數(shù)據(jù)自動(dòng)編碼。 II. 舉例:

import requests ... resp = requests.get(’http://www.mywebsite.com/user’) userdata = {'firstname': 'John', 'lastname': 'Doe', 'password': 'jdoe123'} resp = requests.post(’http://www.mywebsite.com/user’, params=userdata) resp = requests.put(’http://www.mywebsite.com/user/put’) resp = requests.delete(’http://www.mywebsite.com/user/delete’) resp.json() # 假如返回的是json數(shù)據(jù) resp.text #返回的不是text數(shù)據(jù) resp.headers[’content-type’] #返回text/html;charset=utf-8 f = open(’request_index.html’, ’w’) f.write(page.encode(’utf8’))#test 發(fā)現(xiàn)requests抓下來的頁面必須要編碼 #寫入,(抓下來的是unicode),urllib和urllib2抓下來可以直接寫入, #因?yàn)檫@兩者抓下來的page是str

III. 其他功能特性

國(guó)際化域名和 URLs

Keep-Alive & 連接池

持久的 Cookie 會(huì)話

類瀏覽器式的 SSL 加密認(rèn)證

基本/摘要式的身份認(rèn)證

優(yōu)雅的鍵/值 Cookies

自動(dòng)解壓

Unicode 編碼的響應(yīng)體

多段文件上傳

連接超時(shí)

支持 .netrc

適用于 Python 2.6—3.4線程安全

IV. requests不是python自帶的庫,需要另外安裝 easy_install or pip install

V. requests缺陷:直接使用不能異步調(diào)用,速度慢(from others)。官方的urllib可以替代它。

VI. 個(gè)人不建議使用requests模塊

更詳細(xì)的相關(guān)介紹

urllib 官網(wǎng)

urllib2 官網(wǎng)

以上這篇django queryset 去重 .distinct()說明就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Django
相關(guān)文章:
主站蜘蛛池模板: 镀锌角钢_槽钢_扁钢_圆钢_方矩管厂家_镀锌花纹板-海邦钢铁(天津)有限公司 | 菏泽商标注册_菏泽版权登记_商标申请代理_菏泽商标注册去哪里 | 不锈钢水箱生产厂家_消防水箱生产厂家-河南联固供水设备有限公司 | 水厂自动化|污水处理中控系统|水利信息化|智慧水务|智慧农业-山东德艾自动化科技有限公司 | 上海公众号开发-公众号代运营公司-做公众号的公司企业服务商-咏熠软件 | 1000帧高速摄像机|工业高速相机厂家|科天健光电技术 | b2b网站大全,b2b网站排名,找b2b网站就上地球网 | 无痕胶_可移胶_无痕双面胶带_可移无痕胶厂家-东莞凯峰 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 软文世界-软文推广-软文营销-新闻稿发布-一站式软文自助发稿平台 | 德国进口电锅炉_商用电热水器_壁挂炉_电采暖器_电热锅炉[德国宝] | 定制/定做冲锋衣厂家/公司-订做/订制冲锋衣价格/费用-北京圣达信 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 新型游乐设备,360大摆锤游乐设备「诚信厂家」-山东方鑫游乐设备 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 北京网络营销推广_百度SEO搜索引擎优化公司_网站排名优化_谷歌SEO - 北京卓立海创信息技术有限公司 | KBX-220倾斜开关|KBW-220P/L跑偏开关|拉绳开关|DHJY-I隔爆打滑开关|溜槽堵塞开关|欠速开关|声光报警器-山东卓信有限公司 | 德国GMN轴承,GMN角接触球轴承,GMN单向轴承,GMN油封,GMN非接触式密封 | 福尔卡(北京)新型材料技术股份有限公司| 交流伺服电机|直流伺服|伺服驱动器|伺服电机-深圳市华科星电气有限公司 | 小型铜米机-干式铜米机-杂线全自动铜米机-河南鑫世昌机械制造有限公司 | 铝合金脚手架厂家-专注高空作业平台-深圳腾达安全科技 | 小青瓦丨古建筑瓦丨青瓦厂家-宜兴市徽派古典建筑材料有限公司 | 维泰克Veertek-锂电池微短路检测_锂电池腐蚀检测_锂电池漏液检测 | 洛阳装修公司-洛阳整装一站式品牌-福尚云宅装饰 | 台式低速离心机-脱泡离心机-菌种摇床-常州市万丰仪器制造有限公司 | 缠膜机|缠绕包装机|无纺布包装机-济南达伦特机械设备有限公司 | 实验室隔膜泵-无油防腐蚀隔膜泵-耐腐蚀隔膜真空泵-杭州景程仪器 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 冷凝锅炉_燃气锅炉_工业燃气锅炉改造厂家-北京科诺锅炉 | 温州食堂承包 - 温州市尚膳餐饮管理有限公司 | 大型低温冷却液循环泵-低温水槽冷阱「厂家品牌」京华仪器_京华仪器 | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 | 玉米深加工设备|玉米加工机械|玉米加工设备|玉米深加工机械-河南成立粮油机械有限公司 | 山东PE给水管厂家,山东双壁波纹管,山东钢带增强波纹管,山东PE穿线管,山东PE农田灌溉管,山东MPP电力保护套管-山东德诺塑业有限公司 | 篮球架_乒乓球台_足球门_校园_竞技体育器材_厂家_价格-沧州浩然体育器材有限公司 | arch电源_SINPRO_开关电源_模块电源_医疗电源-东佑源 | 今日热点_实时热点_奇闻异事_趣闻趣事_灵异事件 - 奇闻事件 | 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛调查出轨取证公司_青岛婚外情取证-青岛探真调查事务所 | 服务器之家 - 专注于服务器技术及软件下载分享 | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | 深圳诚暄fpc首页-柔性线路板,fpc柔性线路板打样生产厂家 |