Django ORM中的F 對象

F 對象非常強大,可以在查詢和更新操作中進行復雜的字段間運算。

假設我們有一個包含商品信息的模型 Product

from django.db import modelsclass Product(models.Model):name = models.CharField(max_length=100)price = models.DecimalField(max_digits=10, decimal_places=2)discount_price = models.DecimalField(max_digits=10, decimal_places=2)stock = models.IntegerField()def __str__(self):return self.name

1. 比較兩個字段的值

獲取所有折扣價低于原價的商品:

from django.db.models import F# 獲取所有折扣價低于原價的商品
discounted_products = Product.objects.filter(discount_price__lt=F('price'))
for product in discounted_products:print(product.name, product.price, product.discount_price)

2. 字段間的算術運算

計算每個商品的折扣金額(原價減去折扣價),并按折扣金額排序:

# 計算每個商品的折扣金額,并按折扣金額排序
products_with_discount = Product.objects.annotate(discount_amount=F('price') - F('discount_price')
).order_by('-discount_amount')for product in products_with_discount:print(product.name, product.price, product.discount_price, product.discount_amount)

3. 使用 F 對象進行更新操作

將所有庫存少于10的商品的價格提高10%:

# 將所有庫存少于10的商品的價格提高10%
Product.objects.filter(stock__lt=10).update(price=F('price') * 1.10)

4. 結合 F 對象和聚合函數

計算庫存大于20的商品的平均折扣金額:

from django.db.models import Avg# 計算庫存大于20的商品的平均折扣金額
average_discount = Product.objects.filter(stock__gt=20).annotate(discount_amount=F('price') - F('discount_price')
).aggregate(Avg('discount_amount'))print(average_discount)  # 輸出: {'discount_amount__avg': 例如 15.00}

5. 使用 F 對象進行條件更新

將所有庫存少于10的商品的折扣價設置為原價的90%:

# 將所有庫存少于10的商品的折扣價設置為原價的90%
Product.objects.filter(stock__lt=10).update(discount_price=F('price') * 0.90)

6. 使用 F 對象進行字段間比較和過濾

獲取所有折扣金額大于20的商品:

# 獲取所有折扣金額大于20的商品
products_with_large_discount = Product.objects.annotate(discount_amount=F('price') - F('discount_price')
).filter(discount_amount__gt=20)for product in products_with_large_discount:print(product.name, product.price, product.discount_price, product.discount_amount)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/45001.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/45001.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/45001.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL向自增列插入0失敗問題

問題 在一次上線時,發現通過腳本添加的狀態表中,待提交的狀態不正確,本來應該是0,線上是101。 原因 默認情況下,MySQL對應自增列,認為0和null等價(因為mysql認為0不是最佳實踐不推薦使用&…

超簡單的通配證書簽發工具,免費,無需安裝任何插件到本地

常見的acme.sh 或者 lego等工具需要配置,安裝不靈活,續簽需要配置計劃任務,簽發單域名證書或者通配證書需要不同的指令和配置,繁瑣,如果自己程序想要對接簽發證書的api有的不支持,有的用起來繁瑣。 最近發…

[手機Linux PostmarketOS]三, Alpine Linux命令使用

Alpine Linux 一些常用的指令: 添加國內源下載鏈接: 編譯以下文件,添加鏈接進去: sudo vi /etc/apk/repositories##清華源: https://mirror.tuna.tsinghua.edu.cn/alpine/latest-stable/main https://mirror.tuna.tsi…

【VIVADO SDK調試遇到DataAbortHandler】

問題 SDK調試遇到DataAbortHandler問題。 運行后不顯示結果,debug模式下發現進入DataAbortHandler異常函數。程序中存在大數組。 原因:SDK默認的堆棧為1024bytes,需要將堆棧調大。 修改方法: 解決:對application中src下的lscript.ld雙擊,…

android 添加一個水平線

在Android中,添加一個水平線通常可以通過幾種方式實現,最常見的是使用View組件或者自定義的Drawable。下面是一個簡單的例子,展示如何在布局文件中添加一個水平線: 使用View組件 在你的布局XML文件中,你可以添加一個…

Linux 程序卡死的特殊處理

一、前言 Linux環境。 我們在日常編寫的程序中,可能會出現一些細節問題,導致程序卡死,即程序沒法正常運行,界面卡住,也不會閃退... 當這種問題出現在客戶現場,那就是大問題了。。。 當我們暫時還無法排…

Python如何調用C++

ctypes 有以下優點: Python內建,不需要單獨安裝Python可以直接調用C/C 動態鏈接庫(.dll 或 .so)在Python一側,不需要了解 c/c dll 內部的工作方式提供了 C/C 數據類型與Python類型的相互映射,以及轉換,包括指針類型。 在使用cty…

如何定量選擇孔銷基準?-DTAS來幫你!

在當今快速發展的工程領域,公差仿真的作用日漸重要,在公差仿真中,基準體系的選擇對于最終結果更是至關重要。基準體系不同可能導致仿真過程中的參數計算、誤差分析以及最終的工程設計都有所不同。基準體系作為評估和比較的參照,直…

Suricata引擎二次開發之命中規則定位

二開背景 suricata是一款高性能的開源網絡入侵檢測防御引擎,旨在檢測、預防和應對網絡中的惡意活動和攻擊。suricata引擎使用多線程技術,能夠快速、準確地分析網絡流量并識別潛在的安全威脅,是眾多IDS和IPS廠商的底層規則檢測模塊。 前段時間…

強制升級最新系統,微軟全面淘汰Win10和部分11用戶

說出來可能不信,距離 Windows 11 正式發布已過去整整三年時間,按理說現在怎么也得人均 Win 11 水平了吧? 然而事實卻是,三年時間過去 Win 11 占有率僅僅突破到 29%,也就跳起來摸 Win 10 屁股的程度。 2024 年 6 月 Wi…

【Linux】磁盤性能壓測-FIO工具

一、FIO工具介紹 fio(Flexible I/O Tester)是一個用于評估計算機系統中 I/O 性能的強大工具。 官網:fio - fio - Flexible IO Tester 注意事項! 1、不要指定文件系統名稱(如/dev/mapper/centos-root),避…

react啟用mobx @decorators裝飾器語法

react如果沒有經過配置,直接使用decorators裝飾器語法會報錯: Support for the experimental syntax ‘decorators’ isn’t currently enabled 因為react默認是不支持裝飾器語法,需要做一些配置來啟用裝飾器語法。 step1: 在 tsconfig.js…

【學術會議征稿】第三屆能源互聯網及電力系統國際學術會議(ICEIPS 2024)

第三屆能源互聯網及電力系統國際學術會議(ICEIPS 2024) 2024 3rd International Conference on Energy Internet and Power Systems 能源互聯網是實現新一代電力系統智能互動、開放共享的重要支撐技術之一,也是提升能源調度效率&#xff0…

SQL 存儲過程

SQL(Structured Query Language)的存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,它經編譯后存儲在數據庫中,用戶通過指定存儲過程的名字并給它傳遞參數(如果有的話&#xff09…

Jetson-AGX-Orin 非docker環境源碼編譯安裝CyberRT

Jetson-AGX-Orin 非docker環境源碼編譯安裝CyberRT 1、安裝依賴 sudo apt update sudo apt-get install g gdb gcc cmake sudo apt install libpoco-dev uuid-dev libncurses5-dev python3-dev python3-pip python3 -m pip install protobuf3.14.02、下載CyberRT源碼 git cl…

【代碼隨想錄算法訓練Day65】卡碼網47.參加科學大會、卡碼網94. 城市間貨物運輸 I

Day65 圖論第九天 卡碼網47.參加科學大會 #include <iostream> #include <vector> #include <list> #include <queue> #include <climits> using namespace std; // 小頂堆 class mycomparison { public:bool operator()(const pair<int, …

Android Studio gradle下載失敗?!

Android Studio安裝后第一個工程&#xff0c;往往要下載gradle&#xff0c;而gradle的下載有的時候很慢&#xff0c;可以將下載好的gradle-x.x.x-all.zip放到指定目錄下&#xff1a; Windows下路徑&#xff1a; C:\Users\你的用戶名\.gradle\wrapper\dist\gradle-x.x.x-all\**…

python+pygame實現五子棋人機對戰之三

上回講過&#xff1a; pythonpygame實現五子棋人機對戰之一 pythonpygame實現五子棋人機對戰之二 界面已經有了&#xff0c;并且可以支持鼠標操作選擇菜單和人機對戰開始下棋了&#xff0c;那電腦是如何應手落子呢&#xff1f;以下內容是通用的類&#xff0c;全部放在utils.…

LiteOS 多線程編程

? 鴻蒙系統的多線程編程步驟&#xff1a; 1. 描述要創建的線程的屬性配置. attr: attributeosThreadAttr_t attr;//聲明一個線程屬性變量memset(&attr, 0, sizeof(attr));//memset改變一個內存單元上存的值為0//以下三個為必須設置的線程屬性attr.name "ledThread&q…

全球高端銷量第一 凱迪仕智能鎖建博會獲重磅大獎再次遙遙領先

2024年7月11日&#xff0c;第26屆中國廣州建博會圓滿落幕。Kaadas凱迪仕第11年受邀參展&#xff0c;憑借超吸睛的賽博風展館和重磅旗艦傳奇大師K70系列智能鎖震撼亮相&#xff0c;吸引抖音網紅云集打卡直播以及眾多主流及行業媒體聚集報道。在大家居建裝行業全球第一展的舞臺上…