如何在 Django 中使用 F() 函数表达式?

现在,让我们看看如何在 Django 中使用 f() 表达式。
我一步一步简单地解释了如何在 python django 中使用 f 表达式。

您将学习 django f() 表达式示例教程。你可以看到 django f() 表达式。让我们开始使用 django 中的 f 表达式。

F() 表达式在 Django QuerySet API 中用于直接引用数据库中的模型字段值。假设您有一个带有价格字段的产品类,并希望将所有产品的价格提高 20%。

在这里,我简单地逐步解释了如何在 Django 中使用 f() 表达式的示例。

一种可能的解决方案是:

products = Product.objects.all()
for product in products:
    product.price *= 1.2
    product.save()

您可以改为使用 F() 表达式在单个查询中更新它:

from django.db.models import F

Product.objects.update(price=F('price') * 1.2)

也可以对单个对象执行此操作:

product = Product.objects.get(pk=5009)
product.price = F('price') * 1.2
product.save()

但是要谨慎对待这种类型的分配。保存模型后,F() 对象仍然存在。

product.price                   # price = Decimal('10.00')
product.price = F('price') + 1
product.save()                  # price = Decimal('11.00')
product.name = 'What the F()'
product.save()                  # price = Decimal('12.00')

因此,在更新这样一个字段之后,product.price将持有django.db.models.expressions的一个实例。使用 CombinedExpression 而不是实际结果。如果你想马上看到结果:

product.price = F('price') + 1
product.save()
print(product.price)            # <CombinedExpression: F(price) + Value(1)>
product.refresh_from_db()
print(product.price)            # Decimal('13.00')

所以,你也可以用它来标注数据:

from django.db.models import ExpressionWrapper, DecimalField

Product.objects.all().annotate(
    value_in_stock=ExpressionWrapper(
        F('price') * F('stock'), output_field=DecimalField()
    )
)

因为 price 是 DecimalField 而 stock 是 IntegerField,所以表达式必须包装在 ExpressionWrapper 对象中。

Product.objects.filter(stock__gte=F('ordered'))

我希望它能帮助你……

发表评论

邮箱地址不会被公开。 必填项已用*标注