Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:保存旧QuerySet以备将来比较_Python_Database_Django_Unit Testing_Django Queryset - Fatal编程技术网

Python Django:保存旧QuerySet以备将来比较

Python 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

我是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))
我的问题是,在调用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)