【问题标题】:How do I prefetch related objects for a list of already fetched ones?如何为已获取的对象列表预取相关对象?
【发布时间】:2017-11-05 14:10:34
【问题描述】:

我在主页上显示 7 个随机对象。为此,我使用基于this answer的解决方案:

class ProductManager(models.Manager):
    def random(self, n_products, filter={}, select_related=None):
        n_products_total = self.filter(**filter).count()
        if n_products_total == 0:
            return []
        r = [self.random_impl(n_products_total, filter, select_related) for i in range(n_products)]
        return [p for p in r if p is not None]

    def random_impl(self, n_products, filter, select_related=None):
        random_index = randint(0, n_products - 1)
        try:
            return self.filter(**filter) \
                .select_related(select_related)[random_index]
        except IndexError:
            return None

random_products = Product.objects.random(7, filter={'enabled': True}, select_related='category')

如果我将prefetch_related=Prefetch('productphoto_set', queryset=ProductPhoto.objects.order_by('pk')) 传递给random_impl 方法,它会为每个产品一次预取一张照片。这并不奇怪。是否可以在商品已获取后手动预获取相关对象?

【问题讨论】:

    标签: django django-models django-orm


    【解决方案1】:

    令我惊讶的是,有一个legal way。有据可查,就是这样。您只需要添加:

    prefetch_related_objects(random_products, Prefetch('productphoto_set', queryset=ProductPhoto.objects.order_by('pk')))
    

    【讨论】:

    • @phoenix 您的稳定链接有一天可能会损坏。
    猜你喜欢
    • 2018-04-04
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2020-09-22
    相关资源
    最近更新 更多