2016-03-22 3 views
0

を使用して2つのテーブル上の2つのフィルタ:のは、これが私のモデルであると仮定してみましょうprefetch_related

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) 

私はラストオーダーピザのIDの中に見てみサイズで32 私は一つだけを使用していることをどのように行うことができますクエリーセット?

#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 

答えて

0

私がのどの部分もかなりよく分からないがあなたのコードを取り除きたい。すでにラストオーダーを取得した場合 は、あなたが行うことができます、もちろん、あなただけのピザをしたい場合は、pizza32.id

を行うことはできませんので、あなたのピザクエリセットを与えるとどうなる

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

事前に注文を取得していない場合は、クエリに参加できます。これは、1つのSQL文で実行されたクエリを作成します。

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

私はあなたの条件を誤解していますが、単に行うことができますように聞こえるかもしれません:last_orderはすでに最新のオーダーであるため、queryset_orders

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

あなたのループは、不要です。

+0

は、私はちょうど代わりqueryset_ordersの唯一のクエリを作成したい= Orders.objects.filter(ID = var_last_order_id).prefetch_related(「ピザ」)とpizza32 = food.pizza.filter(size = 32)それは可能だと思いますか? – Steve

+0

私はあなたができるとは思わない。 1つのクエリでそれを行うのは何ですか? –

0

あなたはピザのサイズは32で注文を得ることができます:あなたがしてこれらの命令の最後を取得することができます

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

prefetch_relatedを使用して
last_order = Orders.objects.filter(
    pizza__size=32, 
).order_by('-order_number')[0] 

、あなたがピザを取得することができます同じクエリ:

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

今、last_order.pizza.all()を実行すると、b任意の追加SQLクエリ。

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

や注文から最初のピザを取得する:あなたが順番に一つだけのピザがあった知っているなら、あなたは行うことができます

last_order.pizza.all()[0] 
関連する問題