2016-10-17 1 views
0

Supposons que j'ai les modèles suivants.Django possible d'imbriquer prefetch liée?

class Item(models.Model): 

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


class ItemSet(models.Model): 

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

Ce que je voudrais faire est

Pour un vendeur donné, récupérer tous les éléments qui sont stockées comme special_items dans itemset.

Le code suivant est ce que je viens avec, havent essayé, juste une intuition, il ne fonctionnera pas. :(
(je veux récupérer item_founds et 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

Eh bien votre utilisation de 'prefetch_related' ne semble pas être si loin, alors peut-être tester et fournir plus d'informations ce qui ne fonctionne pas pour vous! –

Répondre

0

Dans Django vous devez toujours effectuer vos requêtes à partir du modèle que vous voulez à la fin. Dans votre cas, c'est seller.Seller. Sinon, vous obtenez à la fois le code pauvres et le risque de mauvaises performances (comme dans votre code où vous avez deux dans une boucle lookups ...)

Seller.objects.get(pk=<seller id here>).prefetch_related(
    'items', 
    queryset=Item.objects.exclude(
     special_items=None 
    ), 
    to_attr='item_specials' 
) 

qui devrait vous donner un Seller avec un ensemble d'éléments spéciaux item_specials attribut.