首页 > 解决方案 > 如何在 Django (rest_framework) 中为 POST 请求正确地从 APIClient 发送数据

问题描述

我在 Django 单元测试中遇到了一些奇怪的行为。具体来说,我正在使用来自 rest_framework.test 的 APIClient 模块来模拟来自 unittest 的 GET/POST 请求。

通过 POST 请求在 Django ORM 中更新/创建新对象时会出现此问题(请参见下面的代码):

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 shell 中存储对象时,它每次都有效。此外,当从客户端(使用相同的数据)发出请求时,请求每次都会成功。

如果我在 unittest 请求中打印数据,我会得到以下信息: (, u'{}') (, u'unit testing')

型号代码如下:

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问题。但是再一次,将带有 unicode 数据的对象存储在 shell 中工作得很好。需要注意的一个细微差别是,django unittest 将为模型创建一个新的测试数据库,而在 shell 中运行则不会。

我没有答案,所以如果有人能对这里发生的事情有所了解,那就太棒了。

标签: djangounit-testingdjango-rest-framework

解决方案


推荐阅读