如何使用Django查询集预取@property?

问题描述 投票:2回答:1

我想将模型属性预取到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')

有任何线索如何做到这一点?谢谢!

python django prefetch django-select-related
1个回答
2
投票

prefetch_relatedselect_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。

© www.soinside.com 2019 - 2024. All rights reserved.