2016-08-21 66 views
1

我試圖在保存def save_related(self,request,form,* args,** kwargs)方法之前和之後訪問ManyToManyField的queryset。 我想比較它們並獲取添加到ManyToManyField的新對象。如何複製查詢集Django

所以,我老了查詢集有:

def save_related(self, request, form, * args, * * kwargs): 
    obj = form.instance 
    queryset_before = obj.translations.all() 
    print(queryset_before) 
    super(WordAdmin, self).save_related(request, form, * args, * * kwargs) 
    print(queryset_before) 

但打印(queryset_before)調用超()save_related後的新的,更新的查詢集輸出。

所以:

  1. 如何複製查詢集,使儲蓄會不會影響它?
  2. 或者有沒有辦法比較正確地比較ManyToManyField的舊值和新值?

回答

0

你可以得到ID列表前和保存後,然後比較這些列表:

def save_related(self, request, form, *args, **kwargs): 
    obj = form.instance 
    list_before = list(obj.translations.all().values_list('pk', flat=True)) 
    super(WordAdmin, self).save_related(request, form, *args, ** kwargs) 
    list_after = list(obj.translations.all().values_list('pk', flat=True)) 
    added_ids = [x for x in list_after if x not in list_before] 
    removed_ids = [y for y in list_before if y not in list_after] 
0

的問題是,打印查詢集將只評價查詢集的切片,並作爲一個結果,它不會填充查詢集的內部緩存。

在進行更改之前,您需要完全評估查詢集,以便填充內部緩存。要做到這一點,最簡單的方法是用bool()功能:

def save_related(self, request, form, *args, **kwargs): 
    obj = form.instance 
    queryset_before = obj.translations.all() 
    bool(queryset_before) 
    print(queryset_before) 
    super(WordAdmin, self).save_related(request, form, *args, **kwargs) 
    print(queryset_before) 

現在無論是打印語句應該給你相同的結果。