Django:object_set与filter的区别

7
考虑以下情况:
我有一个图像模型,其中使用品牌作为外键。
brand = Brand.objects.get(id = whatever)

我可以通过以下方式之一检索与该模型相关联的所有图像:

我可以使用以下任何一种方法来检索与该模型相关联的所有图像:

images = Image.objects.filter(brand = brand)

或者

images = brand.image_set.all()

从性能角度来看,哪个更快?
1个回答

9

不会有性能差异。在这两种情况下,生成的 SQL 查询将是相同的。

因此选择哪个是个人喜好问题。我个人更喜欢

images = Image.objects.filter(brand=brand)

因为非常明显,您正在返回图像的查询集。

然而,您可以提出争论:

images = brand.image_set.all()

使用这种方式更安全,因为品牌过滤是自动的,而在另一种方式中,您可能会忘记过滤 brand=brand


我猜这也取决于你使用它的上下文,但是使用image_set可以减少代码量,因为你不需要直接导入模型? - alias51
1
@alias51 我认为导入不会对性能产生任何可衡量的影响 - 无论如何都必须加载“Image”模型。 - Alasdair
你能指出一个参考资料,说明在这两种情况下生成的SQL查询是相同的吗?我想进一步了解这个问题。 - Chintan
1
@Chintan 不,我找不到明确的参考资料来证明这些查询是相同的。你只能相信我,或者你可以尝试运行这些查询并检查 connection.queries。你可能会发现相关对象文档很有用。 - Alasdair

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接