2016-03-22 26 views
0

prefetch_related kullanarak bu benim modelidir:İki filtreleri Diyelim

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) 

Ben kullanarak da yapabilirsiniz Nasıl büyüklük 32. ile son sipariş dahilinde pizza id görmeye çalışın tek QuerySet?

#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 

cevap

0

Ben hangi kısmının da oldukça emin değilim Kodunu kaldırmak istiyorsun. Zaten son bir emir almak durumunda , yapabileceğiniz: elbette, sadece bir pizza istiyorsanız pizza32.id

yapamaz, böylece size pizza sorgu kümesini vermek ve yapacağını

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

siparişi daha önce almazsanız, sorgulara katılabilirsiniz. Bu, bir SQL deyiminde yürütülür bir sorgu oluşturur:

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

Ben senin gereksinimi yanlış, ancak bunu sadece gibi geliyor olabilir:

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

last_order zaten en son düzenden dolayı queryset_orders Your döngü, gereksizdir.

+0

Ben sadece yerine queryset_orders sadece bir sorgu oluşturmak istedik = Orders.objects.filter (id = var_last_order_id) .prefetch_related ('pizza') ve pizza32 = food.pizza.filter (size = 32) sizce bu mümkün mü? – Steve

+0

Yapabileceğini sanmıyorum. Bir sorguda bunu yapmanın amacı nedir? –

0

O pizza boyutu ile 32'dir emir alabilirsiniz:

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

Sen bu siparişlerin son alabilirsiniz:

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

prefetch_related kullanarak, içinde pizzalar getirebilir aynı sorgu: Eğer last_order.pizza.all() yaptığınızda Şimdi

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

, orada b olmaz Ek SQL sorguları.

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

Ya siparişinden ilk pizza almaya: sırayla tek bir pizza vardı biliyorsanız, yapabileceğiniz

last_order.pizza.all()[0]