Python Django:保存旧QuerySet以备将来比较
我是django的新手,我正在尝试做一个单元测试,在这个测试中,我想在批处理编辑函数调用之前和之后比较QuerySetPython Django:保存旧QuerySet以备将来比较,python,database,django,unit-testing,django-queryset,Python,Database,Django,Unit Testing,Django Queryset,我是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' : '00
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))
我的问题是,在调用batchEditing之后,查询将被更新。因此,两个查询集将是相同的
QuerySet似乎绑定到数据库的当前状态。
这正常吗?
有没有办法从数据库中解除查询集的绑定
我尝试了queryset.values,list(queryset),但它仍然会更新值。
我实际上在考虑迭代queryset并自己创建一个字典列表,但我想知道是否有更简单的方法
这里是批处理编辑(未粘贴输入有效性检查)
这是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
Queryset本质上只是生成SQL,只有在对其求值时,才会命中数据库。就我所记得的,这是在迭代Queryset时发生的。比如说,
gamescache = list(Game.objects.all())
或
点击数据库。以下代码应该可以工作:
def test_batchEditing_9(self):
reset() #reset database for test
query = Game.objects.all()
query_old = set(query)
dict_value = {'game_code' : '001'}
Utility.batchEditing(Game, query, dict_value)
query_new = set(query)
self.assertEqual(query_old, query_new)
这是因为Game.objects.all()
没有命中数据库,只是创建了存储查询参数的对象
顺便说一句,如果您将在查询中使用order_by,并且order很重要,那么您可以使用list而不是set。您还将遇到一个问题,即比较django模型只会查看pk,因此如果您更新模型并将其与原始模型进行比较,它们将始终是相同的。我已经通过覆盖模型的eq来解决这个问题,使其成为比较内容的东西,而不仅仅是pk。我们可能还希望看到
compareQuerySet
的代码。实际上,在尝试之后,您不能使用查询作为参数调用set。您必须使用Game.objects.all()直接调用它,否则您只需创建一组SQL命令,它们也将访问更新的数据库。感谢
for g in Game.objects.all():
...
def test_batchEditing_9(self):
reset() #reset database for test
query = Game.objects.all()
query_old = set(query)
dict_value = {'game_code' : '001'}
Utility.batchEditing(Game, query, dict_value)
query_new = set(query)
self.assertEqual(query_old, query_new)