如何在模型的保存方法中使用 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)
这将自动获取相关的 X
和 Y
对象。现在,如果我想在 Z
class 的重写 save()
方法中使用 select_related()
怎么办?我该怎么做呢?谢谢。
您不能在 save
方法中使用它,因为 select_related
是一个查询集方法,而不是实例方法
但是如果你这样做
z = Z.objects.select_related('y__x').get(pk=1)
....
z.save()
您将得到预期的行为,因为 y
和 x
将加入,这要归功于 select_related
不会有额外的数据库查询。
如果您在没有 select_related
的情况下执行以下操作 -
z = Z.objects.get(pk=1)
....
z.save()
你仍然可以在你的save
方法中引用y
和x
。在这种情况下,django 将执行额外的数据库查询以获取相关数据。
假设我有以下型号:
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)
这将自动获取相关的 X
和 Y
对象。现在,如果我想在 Z
class 的重写 save()
方法中使用 select_related()
怎么办?我该怎么做呢?谢谢。
您不能在 save
方法中使用它,因为 select_related
是一个查询集方法,而不是实例方法
但是如果你这样做
z = Z.objects.select_related('y__x').get(pk=1)
....
z.save()
您将得到预期的行为,因为 y
和 x
将加入,这要归功于 select_related
不会有额外的数据库查询。
如果您在没有 select_related
的情况下执行以下操作 -
z = Z.objects.get(pk=1)
....
z.save()
你仍然可以在你的save
方法中引用y
和x
。在这种情况下,django 将执行额外的数据库查询以获取相关数据。