补丁后 Django 不一致测试

Django Inconsistent Test after Patch

我在 patch 之后得到的结果不一致。我正在尝试比较修补后的结果。我想在打补丁时将数据删除之前将数据存储在变量中。当我尝试在修补后打印数据时,它会得到新的不同结果。下面,我要将老狗存入old。但是在补丁之后,它会更新为新值,例如 new。我的补丁序列化程序在打补丁时删除了旧记录。

#models.py
class Owner(models.Model):
    owner = models.CharField()

class Dog(models.Model):
    owner = models.ForeignKey(Owner,on_delete=models.CASCADE)
    name = models.CharField()

#test.py
class Update(APITestCase):
    def test_update_dog(self):
        old = Dog.objects.filter(owner=1).order_by('id')
        print(old) # <QuerySet [<Dog: Ben>, <Dog: Phoebe>]>

        data = {
            'dogs': [
                {'name': 'Ryan'},
                {'name': 'Louis'}
            ]
        }

        response = self.client.post(
            '/admin/login/', {'username': 'admin', 'password': 'password123'})

        response = self.client.patch('/app/dogs/1/',
                                     data=data,
                                     format='json')

        new = Dog.objects.filter(owner=1).order_by('id')
        print(new) # <QuerySet [<Dog: Ryan>, <Dog: Louis>]>
        print(old) # <QuerySet [<Dog: Ryan>, <Dog: Louis>]>

        self.assertNotEqual(old[0].name, new[0].name)
        self.assertNotEqual(old[1].name, new[1].name)

原因是 Django 中的查询集是 lazy。当您将旧结果存储在变量中时,并不意味着实际执行了任何 DB activity。您可以只存储属性值并像这样进行检查:

old = Dog.objects.filter(owner=1).order_by('id').values('id', 'name')
...
self.assertNotEqual(old, new.values('id', 'name'))