2016-10-17 2 views
0

次のモデルがあるとします。私がやりたいのは何Djangoはプリフェッチにネストすることができますか?

class Item(models.Model): 

    seller = models.ForeignKey('seller.Seller') 


class ItemSet(models.Model): 

    items = models.ManyToManyField("Item", related_name="special_items") 

は項目セットでspecial_itemsとして格納されているすべてのアイテムを取得し、与えられた売り手のために

です。

次のコードは、私が思いついたものです。試してみたhavent、ちょうどそれがうまくいかないでしょう。 :(
(私はitem_foundsとitem_specialsを取得したい)ジャンゴで

item_founds = Item.objects.filter(seller=seller).prefetch_related(
    Prefetch(
     "special_items", 
     queryset=Items.objects.prefetch_related("items") 
    ) 
) 

item_specials = Item.objects.none() 
for item_found in item_founds.all(): 
    for special_item in item_found.special_items.all(): 
     item_specials |= special_item.items.all() 
+0

'prefetch_related'の使い方はそれほど遠くないように思われるので、テストして、何がうまく動作しないのか詳細情報を提供してください! –

答えて

0

あなたはいつもあなたが最後にしたいモデルからクエリを実行する必要があります。seller.Sellerだあなたのケースでは。そうでなければ、あなたが悪いコードの両方を取得しますそして、(あなたがループ内で2つのルックアップを持っているあなたのコードのように...)リスク悪いパフォーマンス

Seller.objects.get(pk=<seller id here>).prefetch_related(
    'items', 
    queryset=Item.objects.exclude(
     special_items=None 
    ), 
    to_attr='item_specials' 
) 
item_specials属性に特別なアイテムのセットであなたの Sellerを与える必要があり

関連する問題