2013-02-17 14 views
6

ho seguenti modelli:molti a molti e come ottenere un set di query da queryset

class Store(models.Model): 
    name = CharField(max_length=30) 
    product = models.ManyToManyField(Product) 

class Product(models.Model): 
    name = CharField(max_length=30) 

Come arrivare Store s con il prodotto denominato product_name e anche, ottenere tutti i prodotti (tranne il prodotto con il nome product_name) ? È possibile farlo in una query? In SQL raw sarebbe semplice JOIN s. Non sei sicuro di come implementarlo tramite Django.

risposta

4

Si dovrebbe essere in grado di filtrare gli archivi in ​​base a un attributo di Prodotto e quindi prefetch_related degli oggetti recuperati.

Store.objects.filter(product__name="product_name").prefetch_related('product') 

Questo dovrebbe colpire il database il minor numero di volte per ottenere quello che stai cercando - due volte.

È possibile trovare ulteriori documenti here.

+1

Questo non escluderà i prodotti "PRODUCT_NAME" da il risultato prefetch_related –

15

Si può effettivamente fare queste cose con Django a causa della sua valutazione lazy queryset. La ricerca sul campo in di Django accetta sia gli elenchi che i set di query. Il seguente consente di creare un codice SQL nidificato:

stores_qs = Store.objects.filter(product__name='product_name') 
products = Product.objects.filter(store_set__in=stores_qs) 

Here sono i Django in docs.

0

Get Negozi con prodotto chiamato "product_name":

Store.objects.filter(product__name='product_name') 

ottenere tutti i prodotti tranne il prodotto con il nome di "product_name":

Product.objects.exclude(name='product_name')