我对API和Django很陌生,请原谅,如果这是一个愚蠢的问题,但我似乎无法理解。
我有两种型号(ProductOrder和Product(。ProductOrder模型具有来自Product的外键。
这是两个模型。
class Product(models.Model):
name = models.CharField(max_length = 100)
price = models.IntegerField(default = 1)
def __str__(self) -> str:
return f'{self.name} Price => {self.price}'
class ProductOrder(models.Model):
product_id = models.ForeignKey(Product, on_delete=models.CASCADE)
order_dis = models.FloatField()
price = ** Need to get the price of the product using the product id **
order_date = models.DateField()
dis_price = price - order_dis
def __str__(self) -> str:
return f'{self.order_date} {self.dis_price}'
我打算创建一个API,我希望只输入product_id,并希望访问产品价格,从而帮助计算其他一些字段。这可能吗?
这通常是在查询数据时使用计算来完成的。
你应该问问自己";我是将这些数据存储在数据库中,还是根据数据库中的数据进行计算&";。在这种情况下,第二个可能是正确的。
这可以使用QuerySet Annotate来完成。
例如,让我们创建一些对象:
product = Product.objects.create(name="bagel", price=1)
ProductOrder.objects.create(product=product, order_dis=2.5)
现在让我们查询该订单
order = ProductOrder.objects.annotate(
price=F("product__price"),
dis_price=F("product__price") - F("order_dis"),
).first()
print(order.price) # 1
print(order.dis_price) # 1.5
您也可以在Python中实现它来获得单个对象的值:
class ProductOrder(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
order_dis = models.FloatField()
order_date = models.DateField(auto_now=True)
def get_dis_price(self) -> float:
return self.product.price - self.order_dis
def __str__(self) -> str:
return f'{self.order_date} {self.dis_price}'
然后你也可以做
order.get_dis_price() # 1.5