django - 如何在 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 中运行则不会。
我没有答案,所以如果有人能对这里发生的事情有所了解,那就太棒了。
解决方案
推荐阅读
- python - ValueError when trying to use a function to resize an image
- arrays - 无法将迭代器转换为 js_sys::Array
- mysql - MySQL 索引 - Join 和 Order By 需要不同的索引
- pyspark - pyspark 中的 K-means 在 jupyter 笔记本中无限运行,在 zepplin 笔记本中运行良好
- apache-spark - Spark-HBase - GCP模板(1/3) - 如何本地打包Hortonworks连接器?
- python - 根据其他列创建新的数据框列
- mysql - 仅使用 VueJs 连接到数据库
- python - 如何遍历 JSON 对象?
- html - Xamarin 中的 Razor 模板
- html - 从外部样式表调用时未应用 CSS