我想将模型属性预取到Django中的查询集。有办法吗?
以下是三种模式:
class Place(models.Model):
name = models.CharField(max_length=200, blank=True)
@property
def bestpicurl(self):
try:
return self.placebestpic.picture.file.url
except:
return None
class PlaceBestPic(models.Model):
place = models.OneToOneField(Place)
picture = models.ForeignKey(Picture, on_delete=models.CASCADE)
class Picture(models.Model):
file = ImageField(max_length=500, upload_to="/images/")
我需要类似的东西:
qs = Place.objects.all().select_related('bestpicurl')
有任何线索如何做到这一点? 谢谢!
答案 0 :(得分:2)
prefetch_related
和select_related
是编译到数据库查询中的指令。传递它纯Python属性的名称不起作用,因为您的数据库无法知道它们。您必须选择/预取属性在引擎盖下使用的数据库字段/关系:
qs = Place.objects.select_related('placebestpic')
现在,调用该属性不会命中db:
for p in qs:
# do stuff with p.bestpicurl
即使您在此处遵循反向关系,也不要使用prefetch_related
。来自select_related
docs:
您还可以在传递给select_related的字段列表中引用OneToOneField的反方向 - 也就是说,您可以将OneToOneField遍历回定义字段的对象。不要指定字段名称,而是对相关对象上的字段使用related_name。