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' : '001'}
      Utility.batchEditing(Game, query, dict_value)
      query_new   = Game.objects.all()
      self.assertTrue(compareQuerySet(query_old, query_new))

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

似乎QuerySet绑定到数据库的当前状态。这正常吗?是否有一种方法可以从数据库中解绑定QuerySet ?

我试过查询集。值,列表(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

Queryset本质上只是生成SQL,只有在对其进行评估时,才会命中数据库。据我所知,这发生在对Queryset进行迭代时。例如,

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

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)

这是因为Game.objects.all()没有访问数据库,而只是创建了存储查询参数的对象。

顺便说一句。如果你将在查询中使用order_by,并且顺序很重要,你可以使用list而不是set。

相关内容

  • 没有找到相关文章

最新更新