gpt4 book ai didi

python - Django:保存旧的查询集以供将来比较

转载 作者:搜寻专家 更新时间:2023-10-30 20:44:16 25 4
gpt4 key购买 nike

我是 django 的新手,我正在尝试进行单元测试,我想在批量编辑函数调用之前和之后比较 QuerySet。

    def test_batchEditing_9(self):
reset() #reset database for test
query = Game.objects.all()
query_old = Game.objects.all()
dict_value = {'game_code' : '001'}
Utility.batchEditing(Game, query, dict_value)
query_new = Game.objects.all()
self.assertTrue(compareQuerySet(query_old, query_new))

我的问题是 query_old 将在调用 batchEditing 后更新。因此,两个查询集将是相同的。

看来QuerySet是绑定(bind)到数据库的当前状态的。这是正常的吗?有没有办法从数据库中解除 QuerySet 的绑定(bind)?

我已经尝试过 queryset.values, list(queryset) 但它仍然会更新值。我实际上正在考虑迭代查询集并自己创建一个字典列表,但我想知道是否有更简单的方法。

这里是batchEditing(没有贴输入有效性检查)

def batchEditing(model, query, values):
for item in query:
if isinstance(item, model):
for field, val in values.iteritems():
if val is not None:
setattr(item, field, val)
item.save()

这里是compareQuerySet

def compareQuerySet(object1, object2):
list_val1 = object1.values_list()
list_val2 = object2.values_list()
for i in range(len(list_val1)):
if list_val1[i] != list_val2[i]:
return False
return True

最佳答案

查询集本质上只是生成 SQL,并且只有在对其进行评估时,数据库才会被命中。据我所知,这是在遍历查询集时发生的。例如,

gamescache = list(Game.objects.all())

for g in Game.objects.all():
...

点击数据库。

关于python - Django:保存旧的查询集以供将来比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7067228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com