补丁后Django测试不一致

时间:2020-02-12 08:21:53

标签: django django-rest-framework django-testing

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)

1 个答案:

答案 0 :(得分:1)

原因是Django中的查询集为lazy。当您将旧结果存储在变量中时,并不意味着实际上已执行任何数据库活动。您可以只存储属性值并进行如下检查:

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