Метод patch

Метод patch применяется к экземпляру класса Client и выполняет частичное обновление ресурса на сервере. Он принимает путь к представлению и данные для обновления в формате словаря или строки. Метод возвращает объект ответа, содержащий статус-код и содержимое ответа. В тестах он позволяет эмулировать PATCH-запросы для проверки частичного обновления данных.

Синтаксис

pythonclient.patch(path, data=None, content_type='application/octet-stream', follow=False, secure=False, **extra)

Параметры

Метод patch принимает следующие параметры:

Пример . Использование с моделью Article

Давайте отправим PATCH-запрос для частичного обновления статьи с идентификатором 1, изменив только заголовок:

pythonfrom 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}")

Результат выполнения кода:

python"Updated title: New Title"
"Old content: Old Content"

Пример . С проверкой статуса ответа

Проверим, что PATCH-запрос возвращает статус-код 200 при успешном обновлении и 404 при обращении к несуществующему ресурсу:

pythonfrom 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}")

Результат выполнения кода:

python"Success status: 200"
"Not found status: 404"

Пример . С частичным обновлением нескольких полей

Отправим PATCH-запрос для обновления нескольких полей статьи, передав только те поля, которые нужно изменить:

pythonfrom 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}")

Результат выполнения кода:

python"New title: Updated Title"
"New views: 25"
"Content unchanged: Original Content"

Смотрите также

  • класс Client,
    который предоставляет методы для эмуляции запросов
  • метод get,
    который отправляет GET-запросы в тестах
  • метод post,
    который отправляет POST-запросы для создания данных
  • метод delete,
    который отправляет DELETE-запросы для удаления данных