django ORM之values和annotate使用詳解
任務(wù)需求:項(xiàng)目中有個(gè)問題表,存儲(chǔ)所有的問題,以_id為編號(hào),由于_id未做唯一校驗(yàn),所以早期數(shù)據(jù)有多個(gè)問題使用同一編號(hào)的情況。
需求就是找出編號(hào)有重復(fù)的數(shù)據(jù),只保留第一個(gè)
開始之前
使用了values和annotate兩個(gè)函數(shù)
簡(jiǎn)單的來說values可以理解成展示models指定列的值
annotate起到了group by的作用,
所以我做的事就是對(duì)指定字段按個(gè)數(shù)進(jìn)行統(tǒng)計(jì),然后留下重復(fù)編號(hào)的數(shù)據(jù),進(jìn)行清洗
看看數(shù)據(jù)庫(kù)數(shù)據(jù)
查看每條數(shù)據(jù)的_id的值
對(duì)_id數(shù)據(jù)條數(shù)進(jìn)行統(tǒng)計(jì)
轉(zhuǎn)換數(shù)據(jù)格式為list
Emmm。。。我只需要重復(fù)數(shù)據(jù),所以把_id唯一的數(shù)據(jù)剔除
寫個(gè)簡(jiǎn)單的遍歷
然后只需要找到這些數(shù)據(jù),對(duì)每個(gè)_id只留下第一條數(shù)據(jù)
導(dǎo)出sql,做個(gè)備份,開始刪除數(shù)據(jù)
最終處理:
刪除過程:
再回到網(wǎng)站看看數(shù)據(jù)清洗后的效果
補(bǔ)充知識(shí):django中annotate的一點(diǎn)使用方法
annotate 使用方法:
有時(shí)候我們需要連接兩個(gè)表做一些查詢,比如博客中有兩個(gè)模型,一個(gè)文章模型,一個(gè)分類模型,分類模型是文章中的分類字段的外鍵,如果我們需要查詢每個(gè)分類下文章的數(shù)量,最簡(jiǎn)單的方法就是先將所有分類查到:
categories = NewsCategory.objects.all()
文章模型名稱為News
然后每個(gè)分類django都會(huì)自動(dòng)給你添加一個(gè)屬性category.news_set,這個(gè)方法就可以拿到分類對(duì)應(yīng)的文章,然后category.news_set.count()就可以拿到每個(gè)分類有多少個(gè)文章了。
但是這個(gè)方法很低級(jí)啊,如果想高級(jí)一點(diǎn),查詢性能更優(yōu)化,annotate了解一下
現(xiàn)在就可以對(duì)上面的查詢方法進(jìn)行優(yōu)化了。
categories = NewsCategory.objects.annotate(num_count=Count('news'))
annotate中其實(shí)是給categories(Queryset)添加了一個(gè)屬性,Queryset中的每個(gè)對(duì)象都會(huì)有這么一個(gè)屬性
現(xiàn)在可以這樣查詢分類下的文章數(shù)量:
category.num_count()
將代碼貼出來
原先的代碼:
def cms_news_category(request): categories = NewsCategory.objects.all() context = { 'categories': categories } return render(request, 'cms/category.html', context=context) 模板category.html中的代碼: {% for category in categories %} <td>{{ category.name }}</td> <td>{{ category.news_set.count }}</td> {% endfor %}
使用annotate后的代碼:
def cms_news_category(request): categories = NewsCategory.objects.annotate(num_count=Count('news')) context = { 'categories': categories } return render(request, 'cms/category.html', context=context) 模板category.html中的代碼: {% for category in categories %} <td>{{ category.name }}</td> <td>{{ category.num_count }}</td> {% endfor %}
以上這篇django ORM之values和annotate使用詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python RuntimeError: thread.__init__() not called解決方法
這篇文章主要介紹了Python RuntimeError: thread.__init__() not called解決方法,需要的朋友可以參考下2015-04-04OpenCV模板匹配matchTemplate的實(shí)現(xiàn)
這篇文章主要介紹了OpenCV模板匹配matchTemplate的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10tensorflow學(xué)習(xí)筆記之簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)訓(xùn)練和測(cè)試
這篇文章主要為大家詳細(xì)介紹了tensorflow學(xué)習(xí)筆記,用簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)來訓(xùn)練和測(cè)試,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04videocapture庫(kù)制作python視頻高速傳輸程序
python視頻高速傳輸程序,大家參考使用吧2013-12-12簡(jiǎn)單談?wù)刾ython中的lambda表達(dá)式
Lambda表達(dá)式在Python中經(jīng)常使用到,本文是給大家分享的小編總結(jié)出來的Lambda表達(dá)式的常用方法。2018-01-01解決pytorch 交叉熵?fù)p失輸出為負(fù)數(shù)的問題
這篇文章主要介紹了解決pytorch 交叉熵?fù)p失輸出為負(fù)數(shù)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07跟老齊學(xué)Python之傳說中的函數(shù)編寫條規(guī)
在使用函數(shù)的時(shí)候,首先要把它放在對(duì)象的層面考量,它不是什么特殊的東西,盡管我們使用了不少篇幅講述它,但它終歸還是一個(gè)對(duì)象。2014-10-10