我是新的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。