国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Django筆記二十四之?dāng)?shù)據(jù)庫(kù)函數(shù)之比較和轉(zhuǎn)換函數(shù)

這篇具有很好參考價(jià)值的文章主要介紹了Django筆記二十四之?dāng)?shù)據(jù)庫(kù)函數(shù)之比較和轉(zhuǎn)換函數(shù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

本文首發(fā)于公眾號(hào):Hunter后端
原文鏈接:Django筆記二十四之?dāng)?shù)據(jù)庫(kù)函數(shù)之比較和轉(zhuǎn)換函數(shù)

這一篇筆記開(kāi)始介紹幾種數(shù)據(jù)庫(kù)函數(shù),以下是幾種函數(shù)及其作用

  1. Cast 轉(zhuǎn)換類(lèi)型
  2. Coalesce 優(yōu)先取值
  3. Greatest 返回較大值
  4. Nullif 值相同返回 None

1、model 準(zhǔn)備

這一篇筆記我們主要用到 Author 和 Entry model 作為示例,下面的是 Author model:

class Author(models.Model):
    name = models.CharField(max_length=200)
    email = models.EmailField(null=True, default=None)
    age = models.IntegerField(null=True, blank=True)
    alias = models.CharField(max_length=50, null=True, blank=True)
    goes_by = models.CharField(max_length=50, null=True, blank=True)

一般來(lái)說(shuō),對(duì)于 CharField 字段,我們是不推薦允許 null=True 存在的,因?yàn)檫@樣的話(huà),在數(shù)據(jù)庫(kù)中就會(huì)存在兩個(gè)空值,一個(gè)是 null,一個(gè)是空字符串 ''。

在這里允許這樣操作是為了方便的介紹下面的功能。

注意下,數(shù)據(jù)庫(kù)相關(guān)函數(shù)都是在 django.db.models.functions 模塊下

2、Cast 轉(zhuǎn)換類(lèi)型

Cast 的作用,我們可以將其理解成轉(zhuǎn)換數(shù)據(jù)類(lèi)型,比如在 Author 中,age 字段是一個(gè) Integer 數(shù)據(jù)。

但是如果我們想要獲取數(shù)據(jù)的時(shí)候想要將其直接變成浮點(diǎn)型數(shù)據(jù),就可以使用 Cast() 函數(shù),通過(guò) output_field=FloatField() 參數(shù)來(lái)指定輸出類(lèi)型。

# 先創(chuàng)建數(shù)據(jù)
from blog.models import Author
Author.objects.create(name='hunter', age=25)

返回一個(gè)新字段,通過(guò) Cast() 函數(shù)來(lái)指定輸出類(lèi)型:

from django.db.models import FloatField
from django.db.models.functions import Cast

author = Author.objects.annotate(float_age=Cast('age', output_field=FloatField())).get(id=1)
print(author.float_age)

最后的輸出就是一個(gè)浮點(diǎn)型數(shù)據(jù)了。

3、Coalesce 優(yōu)先取值

Coalesce 的單詞的含義是 合并、聯(lián)合,但是在這里函數(shù)表現(xiàn)出的意義是,優(yōu)先取值。

Coalesce() 接受多個(gè)字段或者表達(dá)式作為參數(shù),至少為兩個(gè)字段名稱(chēng),然后會(huì)返回第一個(gè)非 null 的字段的值(注意: 空字符串 '' 不被認(rèn)為是 null 值)

每個(gè)元素都必須是相似的類(lèi)型,否則會(huì)引起報(bào)錯(cuò)。

對(duì)于 Author 這個(gè)model,我們想要按照 alias, goes_by, name 三個(gè)字段的這個(gè)順序來(lái)取值。

也就是說(shuō) 有alias 字段就取 alias 的內(nèi)容,否則取 goes_by 的字段值,goes_by 也沒(méi)有 就取 name 字段,這種情況就可以使用 Coalesce() 來(lái)操作。

先來(lái)創(chuàng)建幾條數(shù)據(jù):

Author.objects.create(alias="alias-1", goes_by='goes-by-1', name='name-1')
Author.objects.create(goes_by='goes-by-2', name='name-2')
Author.objects.create(name='name-3')
Author.objects.create(alias="", goes_by='goes-by-4', name='name-4')

以上三條數(shù)據(jù)的 id 在數(shù)據(jù)庫(kù)分別是 2,3,4,5

接下來(lái)可以測(cè)試一下 Coalesce() 這個(gè)函數(shù)

from django.db.models.functions import Coalesce

author = Author.objects.annotate(new_field=Coalesce('alias', 'goes_by', 'name')).get(id=2)
print(author.new_field)
# 輸出 alias-1

author = Author.objects.annotate(new_field=Coalesce('alias', 'goes_by', 'name')).get(id=3)
print(author.new_field)
# 輸出 goes-by-2

author = Author.objects.annotate(new_field=Coalesce('alias', 'goes_by', 'name')).get(id=4)
print(author.new_field)
# 輸出 name-3

author = Author.objects.annotate(new_field=Coalesce('alias', 'goes_by', 'name')).get(id=5)
print(author.new_field)
# 輸出 空字符串 ''

以上幾個(gè)例子,我們就測(cè)試出了新建字段的取值優(yōu)先順序,以及空字符串和 null 在這個(gè)函數(shù)里的區(qū)別(會(huì)跳過(guò)值為 null 的數(shù)據(jù),但是會(huì)取空字符串的字段值)。

空值的默認(rèn)值

其實(shí)用到這里,我們可以發(fā)現(xiàn)這個(gè)函數(shù)的另一個(gè)用法,那就是 null 值下替換的默認(rèn)值。

假設(shè)我們有一個(gè)字段,我們?cè)谌≈档臅r(shí)候,想實(shí)現(xiàn),如果該字段是 null,那么我們?cè)谌≈档臅r(shí)候就想將其替換成另一個(gè)默認(rèn)值,而不是返回 null 或者后續(xù)在內(nèi)存中操作替換默認(rèn)值,可以這樣操作:

from django.db.models import Value
author = Author.objects.annotate(new_field=Coalesce('email', Value('xxx'))).get(id=5)
print(author.new_field)

# id 等于 5 的 Author 數(shù)據(jù),email 字段為空,所以 new_field 的值被替換成了 'xxx'

默認(rèn)值的處理也可以用在聚合中,比如聚合 Sum() 的時(shí)候,如果沒(méi)有滿(mǎn)足條件的數(shù)據(jù),聚合的結(jié)果會(huì)是一個(gè) null,但是我們可以自動(dòng)將其變?yōu)?0:

from django.db.models import Sum, Value
Author.objects.aggregate(age_sum=Coalesce(Sum('age'), Value(0)))

4、Greatest 返回較大值

Greatest() 的用法與 Coalesce 相同,接受兩個(gè)或多個(gè)類(lèi)型相同的元素,返回最大的一個(gè)。

可以比較數(shù)字,和時(shí)間等字段類(lèi)型。

這里示例我們使用 Entry model,我們只用兩個(gè)整型字段:

class Entry(models.Model):
    number_of_comments = models.IntegerField()
    number_of_pingbacks = models.IntegerField()

用法如下:

from blog.models import Entry
from django.db.models.functions import Greatest

Entry.objects.annotate(max_value=Greatest("number_of_comments", "number_of_pingbacks")).get(id=2).max_value

# max_value 字段取值就會(huì)是number_of_comments 和 number_of_pingbacks 之間最大的

這里我們也可以挖掘出一個(gè)騷操作,那就是取值的下限

比如這兩個(gè)字段的值都沒(méi)有達(dá)到我們想要的閾值,比如說(shuō)是2,我們希望返回的值至少是2,可以這樣設(shè)計(jì)程序:

Entry.objects.annotate(max_value=Greatest("number_of_comments", "number_of_pingbacks", Value(2))).get(id=2).max_value

注意: 在MySQL 和 Oracle 中,如果 Greatest 中,只要有一個(gè)字段值為 null,那么結(jié)果就會(huì)返回 null,這一點(diǎn)一定要注意

Least() 這個(gè)取的是最小值,與 Greatest 作用是相反的,但用法是一樣的,不多介紹

5、Nullif 值相同返回 None

獲取兩個(gè)字段,也可以是表達(dá)式的結(jié)果,或者是 Value() 的值,但兩者的數(shù)據(jù)類(lèi)型得一致,用于判斷兩者的值是否相同。

如果兩者的值相同,則返回 Python 里的 None,不相同的話(huà)返回第一個(gè)表達(dá)式的值

用法示例如下:

Entry.objects.annotate(new_field=NullIf("number_of_comments", "number_of_pingbacks")).get(id=1).new_field

Entry.objects.annotate(new_field=NullIf("number_of_comments", Value(2))).get(id=1).new_field

以上就是本篇筆記全部?jī)?nèi)容,下一篇將介紹數(shù)據(jù)庫(kù)函數(shù)之日期函數(shù)

如果想獲取更多后端相關(guān)文章,可掃碼關(guān)注閱讀:
Django筆記二十四之?dāng)?shù)據(jù)庫(kù)函數(shù)之比較和轉(zhuǎn)換函數(shù)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-417782.html

到了這里,關(guān)于Django筆記二十四之?dāng)?shù)據(jù)庫(kù)函數(shù)之比較和轉(zhuǎn)換函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Django筆記二十八之?dāng)?shù)據(jù)庫(kù)查詢(xún)優(yōu)化匯總

    Django筆記二十八之?dāng)?shù)據(jù)庫(kù)查詢(xún)優(yōu)化匯總

    本文首發(fā)于公眾號(hào):Hunter后端 原文鏈接:Django筆記二十八之?dāng)?shù)據(jù)庫(kù)查詢(xún)優(yōu)化匯總 這一篇筆記將從以下幾個(gè)方面來(lái)介紹 Django 在查詢(xún)過(guò)程中的一些優(yōu)化操作,有一些是介紹如何獲取 Django 查詢(xún)轉(zhuǎn)化的 sql 語(yǔ)句,有一些是理解 QuerySet 是如何獲取數(shù)據(jù)的。 以下是本篇筆記目錄: 性

    2023年04月22日
    瀏覽(87)
  • Django筆記二十一之使用原生SQL查詢(xún)數(shù)據(jù)庫(kù)

    Django筆記二十一之使用原生SQL查詢(xún)數(shù)據(jù)庫(kù)

    本文首發(fā)于公眾號(hào):Hunter后端 原文鏈接:Django筆記二十一之使用原生SQL查詢(xún)數(shù)據(jù)庫(kù) Django 提供了兩種方式來(lái)執(zhí)行原生 SQL 代碼。 一種是使用 raw() 函數(shù),一種是 使用 connection.cursor()。 但是官方還是推薦在使用原生 SQL 之前,盡量的先去探索一下 QuerySet 提供的各種 API。 目前而言

    2023年04月10日
    瀏覽(98)
  • Django筆記四十四之Nginx+uWSGI部署Django以及Nginx負(fù)載均衡操作

    Django筆記四十四之Nginx+uWSGI部署Django以及Nginx負(fù)載均衡操作

    本文首發(fā)于公眾號(hào):Hunter后端 原文鏈接:Django筆記四十四之Nginx+uWSGI部署Django以及Nginx負(fù)載均衡操作 這一篇筆記介紹如何使用 Nginx + uWSGI 來(lái)部署 Django。 上一篇筆記中有介紹直接使用 uWSGI 作為 web 服務(wù)器來(lái)部署 Django,這一篇筆記介紹如何使用 Nginx 來(lái)部署。 使用 Nginx 來(lái)部署相

    2024年02月05日
    瀏覽(27)
  • Django筆記之?dāng)?shù)據(jù)庫(kù)函數(shù)之日期函數(shù)

    Django筆記之?dāng)?shù)據(jù)庫(kù)函數(shù)之日期函數(shù)

    日期函數(shù)主要介紹兩個(gè)大類(lèi),Extract() 和 Trunc() Extract() 函數(shù)作用是提取日期,比如我們可以提取一個(gè)日期字段的年份,月份,日等數(shù)據(jù) Trunc() 的作用則是截取,比如? 2022-06-18 12:12:12 ,我們可以根據(jù)需求獲取到日期 2020-06-18,或者更細(xì)粒度到時(shí)分秒 這次我們用到下面這個(gè) mode

    2024年02月13日
    瀏覽(92)
  • 阿里云RDS數(shù)據(jù)庫(kù)基于DTS進(jìn)行數(shù)據(jù)遷移(二十四)

    數(shù)據(jù)傳輸服務(wù)DTS(Data Transmission Service)是阿里云提供的實(shí)時(shí)數(shù)據(jù)流服務(wù),支持RDBMS、NoSQL、OLAP等,集數(shù)據(jù)遷移/訂閱/同步于一體,為您提供穩(wěn)定安全的傳輸鏈路。 DTS官方文檔:https://help.aliyun.com/document_detail/126875.html DTS支持ECS自建M

    2024年01月18日
    瀏覽(23)
  • Django筆記三十七之多數(shù)據(jù)庫(kù)操作(補(bǔ)充版)

    Django筆記三十七之多數(shù)據(jù)庫(kù)操作(補(bǔ)充版)

    本文首發(fā)于公眾號(hào):Hunter后端 原文鏈接:Django筆記三十七之多數(shù)據(jù)庫(kù)操作(補(bǔ)充版) 這一篇筆記介紹一下 Django 里使用多數(shù)據(jù)庫(kù)操作。 在第二十二篇筆記中只介紹了多數(shù)據(jù)庫(kù)的定義、同步命令和使用方式,這一篇筆記作為補(bǔ)充詳細(xì)介紹如何對(duì) Django 系統(tǒng)的多個(gè)數(shù)據(jù)庫(kù)進(jìn)行針對(duì)的

    2024年02月03日
    瀏覽(96)
  • celery筆記四之在Django中使用celery

    celery筆記四之在Django中使用celery

    本文首發(fā)于公眾號(hào):Hunter后端 原文鏈接:celery筆記四之在Django中使用celery 這一篇筆記介紹一下如何在 Django 系統(tǒng)中使用 celery。 如果是想純粹使用 celery,這一篇筆記可以略過(guò)。 本篇筆記目錄如下: 文件配置 task 定義 運(yùn)行 worker 我們這里使用前面的創(chuàng)建的 hunter Django 系統(tǒng)。

    2024年02月09日
    瀏覽(18)
  • 圖數(shù)據(jù)庫(kù)_Neo4j學(xué)習(xí)cypher語(yǔ)言_常用函數(shù)_關(guān)系函數(shù)_字符串函數(shù)_聚合函數(shù)_數(shù)據(jù)庫(kù)備份_數(shù)據(jù)庫(kù)恢復(fù)---Neo4j圖數(shù)據(jù)庫(kù)工作筆記0008

    圖數(shù)據(jù)庫(kù)_Neo4j學(xué)習(xí)cypher語(yǔ)言_常用函數(shù)_關(guān)系函數(shù)_字符串函數(shù)_聚合函數(shù)_數(shù)據(jù)庫(kù)備份_數(shù)據(jù)庫(kù)恢復(fù)---Neo4j圖數(shù)據(jù)庫(kù)工作筆記0008

    然后再來(lái)看一些常用函數(shù),和字符串函數(shù),這里舉個(gè)例子,然后其他的 類(lèi)似 ? 可以看到substring字符串截取函數(shù) ? 可以看到截取成功 ? 聚合函數(shù) ? 這里用了一個(gè)count(n) 統(tǒng)計(jì)函數(shù),可以看到效果 ? 關(guān)系函數(shù),我們用過(guò)就是id(r) 可以取出對(duì)應(yīng)的r的id來(lái)這樣..

    2024年02月12日
    瀏覽(41)
  • 珍藏多年的MySQL函數(shù)大全筆記,掌握數(shù)據(jù)庫(kù)真不難

    珍藏多年的MySQL函數(shù)大全筆記,掌握數(shù)據(jù)庫(kù)真不難

    做程序員的誰(shuí)會(huì)離得開(kāi)數(shù)據(jù)庫(kù)呢? 今天就來(lái)分享一下我整理的MySQL的常用函數(shù),基本上囊括了平時(shí)要用的函數(shù),它們已經(jīng)陪我走過(guò)了不少年頭了,風(fēng)里來(lái)雨里去,縫縫補(bǔ)補(bǔ)又幾年,希望能幫到你們! 如果數(shù)據(jù)庫(kù)函數(shù)你能用得好,其他的東西也就水到渠成了。 序號(hào) 函數(shù) 說(shuō)明

    2023年04月23日
    瀏覽(22)
  • 數(shù)據(jù)庫(kù)—數(shù)據(jù)庫(kù)備份(三十四)

    數(shù)據(jù)庫(kù)—數(shù)據(jù)庫(kù)備份(三十四)

    提示:文章寫(xiě)完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 目錄 前言 一、概述 二、數(shù)據(jù)備份的重要性 三、造成數(shù)據(jù)丟失的原因 四、備份類(lèi)型 4.1物理與邏輯角度 4.2數(shù)據(jù)庫(kù)備份策略角度 五、常見(jiàn)的備份方法 5.1 物理備份 5.2 使用專(zhuān)用備份工具 5.3 通過(guò)啟用二進(jìn)制

    2024年02月15日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包