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

时间:2019-08-13 11:20:28

标签: django django-models django-orm

让我们说我有以下模型:

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对象。现在,如果我想在select_related()类的重写Z方法中使用save(),该怎么办。我将如何去做呢?谢谢。

1 个答案:

答案 0 :(得分:1)

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

但是,如果您这样做

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

您将获得预期的行为,因为yxselect_related合并在一起,因此不会有其他数据库查询。

如果不使用select_related-

进行以下操作
z = Z.objects.get(pk=1)
....
z.save()

您仍然可以在y方法中引用xsave。在这种情况下,django将执行其他数据库查询以获取相关数据。