技術共有

Django ORM の F オブジェクト

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

F オブジェクトは非常に強力で、クエリおよび更新操作で複雑なタスクを実行できます。畑の間手術。

製品情報を含むモデルがあるとします。 Product

from django.db import models

class 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

1. 2 つのフィールドの値を比較します

すべてのアイテムを元の価格よりも割引価格で入手できます。

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3. 使用する F オブジェクト更新操作

在庫が 10 個未満のすべてのアイテムの価格を 10% 値上げします。

# 将所有库存少于10的商品的价格提高10%
Product.objects.filter(stock__lt=10).update(price=F('price') * 1.10)
  • 1
  • 2

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}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

5. 使用する F オブジェクトは条件付きで更新されます

在庫アイテムが 10 個未満のすべてのアイテムの割引価格を元の価格の 90% に設定します。

# 将所有库存少于10的商品的折扣价设置为原价的90%
Product.objects.filter(stock__lt=10).update(discount_price=F('price') * 0.90)
  • 1
  • 2

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7