2013-02-17 2 views
6

Ich habe folgende Modelle:Viele zu viele und wie ein queryset von queryset zu bekommen

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

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

Wie Store s mit Produkt product_name und auch genannt zu bekommen, die alle Produkte erhalten (ausgenommen das Produkt mit dem Namen product_name) ? Ist es möglich, es in einer Abfrage zu machen? In Raw SQL wäre es einfach JOIN s. Nicht sicher, wie man es über Django implementiert.

Antwort

4

Sie sollten in der Lage sein, die Geschäfte basierend auf einem Attribut des Produkts zu filtern und dann die abgerufenen Objekte vorabzuholen.

Dies sollte die Datenbank die wenigsten Male treffen, um zu erreichen, was Sie suchen - zweimal.

Weitere Dokumentationen finden Sie unter here.

+1

Dies wird nicht ausgeschlossen, die "product_name" Produkte aus das prefetch_related Ergebnis –

15

Sie können diese Dinge tatsächlich mit Django tun, weil es eine faule Abfrageauswertung gibt. Djangos in Feldsuche akzeptiert sowohl Listen als auch Abfragesätze. Im Folgenden wird eine verschachtelte SQL-Code erstellen:

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

Here sind die Django in docs.

0

Get Shops mit Produkt "product_name" genannt:

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

Holen Sie sich alle Produkte außer dem Produkt mit dem Namen "product_name":

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