Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django: Saving old QuerySet for future comparison

I'm new with django and I'm trying to make a unit test where I want to compare a QuerySet before and after a batch editing function call.

    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))

My problem is that query_old will be updated after batchEditing is called. Therefor, both querysets will be the same.

It seem that QuerySet is bound to the current state of the database. Is this normal? Is there a way to unbind a QuerySet from the database?

I have tried queryset.values, list(queryset) but it still updates the value. I'm actually thinking about iterating on the queryset and creating a list of dictionaries by myself, but I want to know if there is an easier way.

Here is batchEditing (didn't paste input validity check)

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()

Here is 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
like image 689
Julien Voyer Avatar asked Jan 17 '26 04:01

Julien Voyer


1 Answers

A Queryset is essentially just generating SQL and only on evaluating it, the database is hit. As far as I remember, that happens on iterating over the Queryset. For instance,

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

or

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

hit the database.

like image 180
XORcist Avatar answered Jan 19 '26 19:01

XORcist



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!