How to copy queryset Django
我尝试在保存到def save_相关(self、request、form、*args、**kwargs)方法之前和之后访问manytomanyfield的queryset。我想比较它们并得到新的对象,这些对象被添加到manytomanyfield中。
因此,我得到了旧的查询集:
1 2 3 4 5 6 | 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) |
但print(queryset_before)在调用super()后输出新的、更新的queryset。save_相关。
所以:
问题是,打印一个查询集将只计算查询集的一部分,因此它不会填充查询集的内部缓存。
在进行更改之前,需要完全评估查询集,以便填充内部缓存。最简单的方法是使用
1 2 3 4 5 6 7 | 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语句都应该给出相同的结果。
您可以在保存之前和之后获取ID列表,然后比较这些列表:
1 2 3 4 5 6 7 | 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] |