如何在模型的保存方法中使用 select_related?

How to use select_related in save method of a model?

假设我有以下型号:

from django.db import models

class X(models.Model):
    ...

class Y(models.Model):
    ...
    x = models.ForeignKey(X, on_delete=models.CASCADE)

class Z(models.Model):
    ...
    y = models.ForeignKey(Y, on_delete=models.CASCADE)

现在,在正常查询中,我可以像这样链接 select_related() 函数:

z = Z.objects.select_related('y__x').get(pk=1)

这将自动获取相关的 XY 对象。现在,如果我想在 Z class 的重写 save() 方法中使用 select_related() 怎么办?我该怎么做呢?谢谢。

您不能在 save 方法中使用它,因为 select_related 是一个查询集方法,而不是实例方法

但是如果你这样做

z = Z.objects.select_related('y__x').get(pk=1)
....
z.save()

您将得到预期的行为,因为 yx 将加入,这要归功于 select_related 不会有额外的数据库查询。

如果您在没有 select_related 的情况下执行以下操作 -

z = Z.objects.get(pk=1)
....
z.save()

你仍然可以在你的save方法中引用yx。在这种情况下,django 将执行额外的数据库查询以获取相关数据。