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)