Метод patch
Метод patch применяется к экземпляру класса Client
и выполняет частичное обновление ресурса на сервере.
Он принимает путь к представлению и данные для обновления
в формате словаря или строки. Метод возвращает объект
ответа, содержащий статус-код и содержимое ответа.
В тестах он позволяет эмулировать PATCH-запросы для
проверки частичного обновления данных.
Синтаксис
client.patch(path, data=None, content_type='application/octet-stream', follow=False, secure=False, **extra)
Параметры
Метод patch принимает следующие параметры:
- ⁅b⁆path⁅/b⁆ - обязательный параметр, указывает URL-адрес представления, к которому отправляется запрос
- ⁅b⁆data⁅/b⁆ - необязательный параметр, содержит данные для частичного обновления в виде словаря или строки
-
⁅b⁆content_type⁅/b⁆ - тип содержимого запроса,
по умолчанию используется
'application/octet-stream' -
⁅b⁆follow⁅/b⁆ - если установлен в
True, клиент будет следовать за редиректами, по умолчаниюFalse -
⁅b⁆secure⁅/b⁆ - если установлен в
True, запрос будет считаться защищённым (HTTPS), по умолчаниюFalse - ⁅b⁆extra⁅/b⁆ - дополнительные параметры для передачи в запросе, такие как заголовки или cookies
Пример . Использование с моделью Article
Давайте отправим PATCH-запрос для частичного обновления
статьи с идентификатором 1, изменив только заголовок:
from django.test import TestCase
from django.contrib.auth.models import User
from myapp.models import Article
class ArticlePatchTest(TestCase):
def test_partial_update_article(self):
user = User.objects.create_user(username='john', password='secret')
article = Article.objects.create(
title='Old Title',
content='Old Content',
author=user,
status='draft'
)
self.client.login(username='john', password='secret')
update_data = {'title': 'New Title'}
response = self.client.patch(
f'/api/articles/{article.id}/',
data=update_data,
content_type='application/json'
)
article.refresh_from_db()
print(f"Updated title: {article.title}")
print(f"Old content: {article.content}")
Результат выполнения кода:
"Updated title: New Title"
"Old content: Old Content"
Пример . С проверкой статуса ответа
Проверим, что PATCH-запрос возвращает статус-код 200
при успешном обновлении и 404 при обращении к
несуществующему ресурсу:
from django.test import TestCase
from myapp.models import Article
class ArticlePatchStatusTest(TestCase):
def test_patch_success_status(self):
article = Article.objects.create(
title='Test Article',
content='Test Content',
status='draft'
)
response = self.client.patch(
f'/api/articles/{article.id}/',
data={'status': 'published'},
content_type='application/json'
)
print(f"Success status: {response.status_code}")
def test_patch_not_found_status(self):
response = self.client.patch(
'/api/articles/999/',
data={'title': 'New Title'},
content_type='application/json'
)
print(f"Not found status: {response.status_code}")
Результат выполнения кода:
"Success status: 200"
"Not found status: 404"
Пример . С частичным обновлением нескольких полей
Отправим PATCH-запрос для обновления нескольких полей статьи, передав только те поля, которые нужно изменить:
from django.test import TestCase
from django.contrib.auth.models import User
from myapp.models import Article
class ArticleMultiPatchTest(TestCase):
def test_partial_update_multiple_fields(self):
user = User.objects.create_user(username='admin', password='admin123')
article = Article.objects.create(
title='Original Title',
content='Original Content',
author=user,
status='draft',
views=10
)
self.client.login(username='admin', password='admin123')
update_data = {
'title': 'Updated Title',
'views': 25
}
response = self.client.patch(
f'/api/articles/{article.id}/',
data=update_data,
content_type='application/json'
)
article.refresh_from_db()
print(f"New title: {article.title}")
print(f"New views: {article.views}")
print(f"Content unchanged: {article.content}")
Результат выполнения кода:
"New title: Updated Title"
"New views: 25"
"Content unchanged: Original Content"