1

def save_related(self、request、form、* args、** kwargs)メソッドで保存する前と後にManyToManyFieldのクエリーセットにアクセスしようとしています。 それらを比較し、ManyToManyFieldに追加された新しいオブジェクトを取得したいと思います。queryset 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. 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) 

今両方のprint文はあなたに同じ結果を与える必要があります。

関連する問題