Django: сохранение старого QuerySet для будущего сравнения - PullRequest
2 голосов
/ 15 августа 2011

Я новичок в 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.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()

Вот сравнениеQuerySet

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

Ответы [ 2 ]

1 голос
/ 15 августа 2011

Queryset, по сути, просто генерирует SQL, и только после его оценки база данных получает доступ Насколько я помню, это происходит при итерации по Queryset. Например,

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

или

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

попал в базу данных.

0 голосов
/ 16 августа 2011

Следующий код должен работать:

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 в запросе, а порядок важен, вы можете использовать список, а не набор.

...