Django Несоответствующий тест после патча - PullRequest
0 голосов
/ 12 февраля 2020

Я получаю несоответствия при получении результатов после 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 Ответ

1 голос
/ 12 февраля 2020

Причина в том, что наборы запросов в Django lazy . Когда вы сохраняете старый результат в переменной, это не означает, что какая-либо операция с БД была фактически выполнена. Вы можете просто сохранить значение атрибута и сделать вид проверки следующим образом:

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