如何复制queryset Djang

2024-04-24 12:11:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在def save_相关(self,request,form,*args,**kwargs)方法保存之前和之后访问ManyToManyField的queryset。 我想比较它们,得到新的对象,它们被添加到很多很多字段中。在

所以,我越来越老了:

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。在

所以:

  1. 如何复制queryset,使保存不会影响它?在
  2. 或者有没有一种方法可以更恰当地比较ManyToManyField的新旧值?在

Tags: 方法selfformobjrequestsavedefargs
2条回答

问题是,打印一个queryset将只计算queryset的一部分,因此,它不会填充queryset的内部缓存。在

在进行更改之前,您需要完全计算queryset,以便填充内部缓存。最简单的方法是使用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语句应该得到相同的结果。在

您可以获取保存前后的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]

相关问题 更多 >