【问题标题】:How to prefetch a @property with a Django queryset?如何使用 Django 查询集预取 @property?
【发布时间】:2018-05-30 23:29:40
【问题描述】:

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

    prefetch_relatedselect_related 是编译到数据库查询中的指令。将纯 Python 属性的名称传递给它不起作用,因为您的数据库无法知道它们。您必须选择/预取属性在后台使用的数据库字段/关系:

    qs = Place.objects.select_related('placebestpic')
    

    现在,调用属性不会命中数据库:

    for p in qs:
        # do stuff with p.bestpicurl
    

    即使您在此处遵循反向关系,也不要使用prefetch_related。来自select_related docs

    您还可以在传递给 select_related 的字段列表中引用 OneToOneField 的相反方向——也就是说,您可以将 OneToOneField 遍历回定义字段的对象。不要指定字段名称,而是使用相关对象上的字段的 related_name。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多