2017-06-04 14 views
0

私はホームページに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にメソッドを渡すと、それは製品ごとに一度に1枚の写真をプリフェッチ。それは驚くべきことではない。製品が既にフェッチされた後、関連するオブジェクトを手動でプリフェッチできますか?

答えて

0

驚いたことに、legal wayがあります。それは文書化されています。あなたはちょうど追加する必要があります:

prefetch_related_objects(random_products, Prefetch('productphoto_set', queryset=ProductPhoto.objects.order_by('pk'))) 
関連する問題