Django如何知道object是否存在



假设我有两个模型,例如:

class Product:
product_name = models.CharField(max_length=40)
class ProductPrice(models.Model):
product = models.OneToOneField(Product, on_delete=models.CASCADE)
product_price = models.FloatField()

请不要担心为什么有人可能需要两个不同的模型/表来处理这些数据。这不是重点。有趣的是,当我查询Product时,我会得到一个python attrproductprice以及对象ONLY IFProductPriceProduct存在关联。

为了更清楚,让我们创建一些虚拟数据:

product1 = Product.objects.create(product_name='first product')
product2 = Product.objects.create(product_name='second product')
product_price = ProductPrice.objects.create(product=product2, price=10.99)

现在试试这个

print(hasattr(product1`, "productprice")) # -> false
print(hasattr(product2`, "productprice")) # -> true

django如何知道数据库中存在ProductPrice?在SQL中,我不知道有任何方法可以在没有第二个查询的情况下检查这一点。我很好奇这是怎么回事。

django如何知道数据库中存在ProductPrice ?

执行SQL查询。实际上,它跟踪所有关系,并为每个关系定义一个相反方向的关系。这些属性是延迟加载的

这意味着如果您使用hasattr(product1, 'productprice'),它将生成如下查询:

SELECT appname_productprice.*
FROM appname_productprice
WHEREappname_productprice.product_id =some_id

如果查询返回一条记录,它将为该属性返回True,如果数据库没有返回任何记录,这将引发AttributeError,因此hasattr(…)将返回False

这些查询因此惰性:只有当您访问属性.productprice时,它才会进行这样的查询,只要您不访问该属性,就不会执行查询。

如果我们看一下Django在print(connection.queries[-1])下运行的最后一个查询,我们看到:

>>> from django.db import connection
>>> print(hasattr(product1, 'productprice'))
False
>>> print(connection.queries[-1])
{'sql': 'SELECT `appname_productprice`.`id`, `appname_productprice`.`product_id`, `appname_productprice`.`product_price` FROM `appname_productprice` WHERE `appname_productprice`.`product_id` = 1 LIMIT 21', 'time': '0.001'}
>>> print(hasattr(product2, 'productprice'))
True
>>> print(connection.queries[-1])
{'sql': 'SELECT `appname_productprice`.`id`, `appname_productprice`.`product_id`, `appname_productprice`.`product_price` FROM `appname_productprice` WHERE `appname_productprice`.`product_id` = 2 LIMIT 21', 'time': '0.001'}

最新更新