如何复制查询集 Django
How to copy queryset Django
我试图在保存 def save_related(self, request, form, *args, **kwargs) 方法之前和之后访问 ManyToManyField 的查询集。
我想比较它们并获取添加到 ManyToManyField 的新对象。
所以,我得到了旧的查询集:
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() 后输出新的、更新的查询集。save_related。
所以:
- 如何复制queryset,保存不影响?
- 或者有没有办法更恰当地比较 ManyToManyField 的新旧值?
你可以得到保存前后的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]
问题是打印查询集只会评估查询集的一部分,因此不会填充查询集的内部缓存。
您需要在进行更改之前完全评估查询集,以便填充内部缓存。最简单的方法是使用 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)
现在两个打印语句应该给你相同的结果。
我试图在保存 def save_related(self, request, form, *args, **kwargs) 方法之前和之后访问 ManyToManyField 的查询集。 我想比较它们并获取添加到 ManyToManyField 的新对象。
所以,我得到了旧的查询集:
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() 后输出新的、更新的查询集。save_related。
所以:
- 如何复制queryset,保存不影响?
- 或者有没有办法更恰当地比较 ManyToManyField 的新旧值?
你可以得到保存前后的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]
问题是打印查询集只会评估查询集的一部分,因此不会填充查询集的内部缓存。
您需要在进行更改之前完全评估查询集,以便填充内部缓存。最简单的方法是使用 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)
现在两个打印语句应该给你相同的结果。