2016-10-15 4 views
0

後に消える:このコマンドの後Djangoのクエリセットは、私はそうのようなシンプルなDjangoのコマンドを持ってupdateコマンド

class OrderQuerySet(models.query.QuerySet): 
    def filter_vendor(self, vendor): 
     return self.filter(agreement_vendors_merchandise_list__agreement_vendors__vendor = vendor) 
    def suggestions(self, legal_entity_own): 
     result = self.filter(status_id = 1, is_active_flg = 1) 
     pending_orders = Order.objects.filter_legal_entity_own(legal_entity_own).\ 
             with_pending_status() 
     vendor_id_list = pending_orders.values('agreement_vendors_merchandise_list__agreement_vendors__vendor').distinct() 
     vendors = Vendors.objects.exclude(id__in = vendor_id_list) 
     result = result.filter_vendors(vendors) 
     return result 

class Order(models.Model): 
     objects = OrderQuerySet.as_manager() 

def my_strange_behaviour_view 
    suggested_orders_qs = Order.objects.suggestions(legal_entity_own_instance).\ 
              filter(chosen_quantity__gt = 0)  
    order_qs_by_vendor = suggested_orders_qs.filter_vendor(v) 
    order_qs_by_vendor.update(status_id = 2) # This command makes the queryset empty 

、クエリセットが空になります! 私はただ迷っています。そして、ドキュメンテーションのヒントを見つけることはできません。誰でも何が起こっているのか説明できますか?

+1

提案 - あなたが代わりにクエリセットに複数のフィルタを適用するので、多段階のフィルタを構築しようとしている場合は、あなたの代わりにフィルタのリストを構築することができますし、骨材と同じ(一度終わりにそれを適用し、内線RAの値、除外、順序付け)。 – serg

+0

Serg、「フィルタのリスト」の意味の短い例を教えてください –

+1

このようなフィルタを連鎖する代わりに、このqueryset.filter(field1 = 'value1')。filter(field2 = 'value2') '' filter = {'field1': 'value1'、 'field2': 'value2'} 'フィルタの辞書を作成し、' queryset.filter(** filters) 'を一度適用する方が便利かもしれません。 – serg

答えて

3

あなたsuggestionsクエリセット方法は、すでにあなたがstatus_id=2でクエリセットを更新したときにそのクエリセットは、単にあなたが、元のクエリセットのシャローコピーを必要とする維持するためにためにstatus_id=1

経由で適用されるフィルタの更なるデータを保持していないstatus_id=1を用いて濾過します更新前:

import copy 
original_qs = copy.copy(order_qs_by_vendor) 
order_qs_by_vendor.update(status_id=2) 
# now try to do original_qs.count() but it will still hold the status_id=1 though 
+0

まあ、私はこれを参照してください。問題は、Djangoがクエリーセットを更新するためのツールを提供していないので、要素のコレクションを失っていないということですか? –

+0

@EdgarNavasardyanが役立つ場合は、私の編集を参照してください。 –

関連する問題