关于python:如何复制查询集Django

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_相关。

所以:

  • 如何复制查询集,以便保存不会影响它?
  • 或者有没有一种方法可以更恰当地比较ManytomanyField的旧值和新值?

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

    在进行更改之前,需要完全评估查询集,以便填充内部缓存。最简单的方法是使用bool()函数:

    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]