Как правильно отправить данные из APIClient в Django (rest_framework) для запроса POST - PullRequest
0 голосов
/ 07 февраля 2019

Я столкнулся с каким-то странным поведением в юнит-тесте Django.В частности, я использую модуль APIClient из rest_framework.test для имитации запросов GET / POST от unittest.

Проблема возникает при обновлении / создании нового объекта в Django ORM с помощью запроса POST (см. Код ниже):

def test_something(self):
    data = {
        "name": 'unit testing',
        "data": {}
        }

    response = self.api_client.post(reverse('save_model'), data=data, format='json')
    self.assertEqual(response.status_code, 200)


@api_view(['GET', 'POST'])
def save_model(request):

    obj, created = MyModel.objects.update_or_create(
    user_id=request.user,
    **request.data
    )

    return JsonResponse({
        'id': obj.id,
        'name': obj.name,
        'user_id': obj.user_id.id
    })

Ошибка, которую я получаю при выполнении тестового примера: Ошибка привязки параметра 1 - возможно, неподдерживаемый тип

На основании других сообщений стека, связанных с этой ошибкой, я предположил бы, что у меня есть проблема с типом для второго параметра (поле данных).Однако когда одни и те же точные данные используются для хранения объекта в оболочке Django, они работают каждый раз.Кроме того, когда запрос сделан клиентом (с теми же данными), запрос выполняется каждый раз.

Если я распечатываю данные в запросе unittest, я получаю следующее: (, u '{}')(тестирование юнитов)

Код модели указан ниже:

class MyModel(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)
    user_id = models.ForeignKey(AUTH_USER_MODEL)
    data = JSONField()

Так что я подумал, что это может быть проблема с Unicode.Но опять же, сохранение объекта с данными Юникода в оболочке работает просто отлично.Заметим одно тонкое отличие: django unittest создаст новую тестовую базу данных для моделей, тогда как работа в оболочке этого не делает.

У меня нет ответов, поэтому, если кто-то сможет пролить свет на то, что здесь происходит,это было бы удивительно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...