您将学习 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'))
我希望它能帮助你……