2016-03-22 23 views
0

wir prefetch_related nehme an, dies ist mein Modell:Zwei Filter auf zwei Tabellen mit

class Pizza(models.Model): 
    size = models.IntegerField() 
    #other fields 

class Order(models.Model): 
    date = models.DateField() 
    pizza = models.ManyToManyField(Pizza, through='OrderPizza') 
    #other fields 


class OrderPizza(models.Model): 
    update = models.BooleanField() 
    order = models.ForeignKey(Order, on_delete=models.CASCADE) 
    pizza = models.ForeignKey(Pizza, on_delete=models.CASCADE) 

Ich versuche, mit Größe 32. innerhalb der letzten, um die ID der Pizza zu sehen Wie kann ich nur, dass die Verwendung eines Abfragegruppe?

#I take the last order: 
last_order = Orders.objects.filter().order_by('-order_number')[:1] 

#If we have at least one order 
if last_order: 
    var_last_order_id = last_order[0].id 
    #First filter 
    queryset_orders = Orders.objects.filter(id=var_last_order_id).prefetch_related('pizza') 

    for food in queryset_orders: 
     #Second filter 
     pizza32 = food.pizza.filter(size = 32) 
     print pizza32.id 

Antwort

0

Ich bin auch nicht ganz sicher, was Teil von Ihr Code, den Sie loswerden wollen. Wenn Sie bereits die letzte Bestellung abzurufen, können Sie tun:

pizza32 = Pizza.objects.filter(order=last_order, size=32) 

die wäre natürlich, geben Sie eine Pizza Abfrage-Set, so dass Sie nicht pizza32.id

tun können, wenn Sie nur die Pizza wollen und tun Wenn Sie die Bestellung nicht im Voraus abrufen, können Sie den Abfragen beitreten. Dadurch wird eine Abfrage erstellen, die in einer SQL-Anweisung ausgeführt wird:

pizza32 = Pizza.objects.filter(order__in=Order.objects.order_by('-order_number')[:1], size=32) 
0

Ich könnte Ihre Anforderung falsch verstanden, aber klingt wie Sie gerade tun könnte:

if Order.objects.exists(): 
    last_order = Order.objects.order_by('-order_number')[:1] 
    pizza32 = last_order.pizza.filter(size=32) 

Ihre Schleife auf queryset_orders nicht notwendig ist, weil last_order ist bereits die jüngste Auftrag.

+0

Ich wollte nur nur eine Abfrage erstellen, statt queryset_orders = Orders.objects.filter (id = var_last_order_id) .prefetch_related ('Pizza') und pizza32 = food.pizza.filter (Größe = 32) Glaubst du, ist das möglich? – Steve

+0

Ich glaube nicht, dass du es kannst. Was ist der Sinn, das in einer Abfrage zu tun? –

0

Sie können die Aufträge erhalten, wo die Pizza Größe 32 mit:

orders = Orders.objects.filter(pizza__size=32) 

Sie können die letzte dieser Aufträge erhalten:

last_order = Orders.objects.filter(
    pizza__size=32, 
).order_by('-order_number')[0] 

prefetch_related verwenden, können Sie die Pizzen holen in die gleiche Abfrage:

last_order = Orders.objects.filter(
    pizza__size=32, 
).order_by('-order_number').prefetch_related('pizza')[0] 

wenn Sie jetzt last_order.pizza.all() tun, wird es nicht b e irgendwelche zusätzlichen SQL-Abfragen. Wenn Sie wissen, dass es in der Reihenfolge nur eine Pizza war, können Sie tun:

for pizza in last_order.pizza.all(): 
    pizza 

Oder die erste Pizza aus dem Auftrag zu erhalten:

last_order.pizza.all()[0]