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. 방법의 검색어 복사하려면?
  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) 

지금 모두 인쇄 문은 당신에게 동일한 결과를 제공해야합니다.

관련 문제