使用Django中的外键从子模型访问父模型的数据



我对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

最新更新