django - Django rest 框架:post() 外键时出错
问题描述
我正在尝试对我的数据库执行简单的 get() post() 。我有现有的数据库,我使用 inspectdb 从中生成 models.py。我在为模型设置复合主键时遇到问题,其中一部分键是外键
模型 TestCase 与 TestSuite 模型具有外键关系。TestCase api 的 get() 运行良好。但是帖子失败并出现以下错误:
File "/usr/local/lib/python3.6/dist-packages/django/core/handlers/exception.py" in inner
35. response = get_response(request)
File "/usr/local/lib/python3.6/dist- packages/django/core/handlers/base.py" in _get_response
128. response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python3.6/dist-packages/django/core/handlers/base.py" in _get_response
126. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python3.6/dist-packages/django/views/decorators/csrf.py" in wrapped_view
54. return view_func(*args, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/rest_framework/viewsets.py" in view
116. return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/rest_framework/views.py" in dispatch
495. response = self.handle_exception(exc)
File "/usr/local/lib/python3.6/dist-packages/rest_framework/views.py" in handle_exception
455. self.raise_uncaught_exception(exc)
File "/usr/local/lib/python3.6/dist-packages/rest_framework/views.py" in dispatch
492. response = handler(request, *args, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/rest_framework/mixins.py" in create
20. serializer.is_valid(raise_exception=True)
File "/usr/local/lib/python3.6/dist-packages/rest_framework/serializers.py" in is_valid
236. self._validated_data = self.run_validation(self.initial_data)
File "/usr/local/lib/python3.6/dist-packages/rest_framework/serializers.py" in run_validation
434. value = self.to_internal_value(data)
File "/usr/local/lib/python3.6/dist-packages/rest_framework/serializers.py" in to_internal_value
491. validated_value = field.run_validation(primitive_value)
File "/usr/local/lib/python3.6/dist-packages/rest_framework/relations.py" in run_validation
160. return super(RelatedField, self).run_validation(data)
File "/usr/local/lib/python3.6/dist-packages/rest_framework/fields.py" in run_validation
536. value = self.to_internal_value(data)
File "/usr/local/lib/python3.6/dist-packages/rest_framework/relations.py" in to_internal_value
263. return self.get_queryset().get(pk=data)
File "/usr/local/lib/python3.6/dist-packages/django/db/models/query.py" in get
407. (self.model._meta.object_name, num)
Exception Type: MultipleObjectsReturned at /dqf_api/test_case/
Exception Value: get() returned more than one TestSuite -- it returned
2!
Request information:
USER: AnonymousUser
可浏览的 api 调用也因上述错误而失败
模型.py
class TestCase(models.Model):
team_name = models.ForeignKey(TestSuite, on_delete=models.DO_NOTHING, db_column='team_name')
suite_name = models.ForeignKey(TestSuite, on_delete=models.DO_NOTHING, db_column='suite_name')
case_name = models.CharField(max_length=100, primary_key=True)
test_type = models.ForeignKey(TestCaseType, on_delete=models.DO_NOTHING)
class Meta:
managed = False
db_table = 'test_case'
unique_together = (('team_name', 'suite_name', 'case_name'),)
class TestSuite(models.Model):
team_name = models.ForeignKey(Team, on_delete=models.DO_NOTHING, db_column='team_name')
suite_name = models.CharField(max_length=100, primary_key=True)
description = models.CharField(max_length=200, blank=True, null=True)
#Additional fields
class Meta:
managed = False
db_table = 'test_suite'
unique_together = (('team_name', 'suite_name'),)
class TestCaseType(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=100)
description = models.CharField(max_length=200, blank=True, null=True)
class Meta:
managed = False
db_table = 'test_case_type'
class Team(models.Model):
team_name = models.CharField(primary_key=True, max_length=30)
description = models.CharField(max_length=100, blank=True, null=True)
class Meta:
managed = False
db_table = 'team'
视图.py
class TestCaseViewSet(viewsets.ModelViewSet):
queryset = models.TestCase.objects.all()
serializer_class = serializers.TestCaseSerializer
class TestSuiteViewSet(viewsets.ModelViewSet):
queryset = models.TestSuite.objects.all()
serializer_class = serializers.TestSuiteSerializer
序列化程序.py
class TestSuiteSerializer(serializers.ModelSerializer):
class Meta:
model = models.TestSuite
fields = '__all__'
class TestCaseSerializer(serializers.ModelSerializer):
class Meta:
model = models.TestCase
fields = '__all__'
数据.json
{
"case_name": "NA",
"description": "NA",
"run_level": 1,
"stop_on_failure": false,
"team_name": "ede",
"suite_name": "dummy",
"test_type": 1
}
test_suite 表中只有一条 team_name =ede 和 suite_name = dummy 的记录
我是 Django 和 DRF 的新手。任何帮助表示赞赏。
解决方案
推荐阅读
- javascript - 开发工具在 Electron 中的大小和位置
- node.js - 请求正文必须包含以下参数:'grant_type'...但我把它放在正文中
- php - 如何在内部创建一个自动递增的 ID
- 已经在while循环中的标签?
- wso2 - WSO2 身份服务器多个回调 URL 中断 checksession 端点
- jquery - Jquery隐藏/显示延迟修复
- amazon-s3 - AWS S3 的保留参数名称列表
- ms-access - 表单输入数据访问 2013 中的输入、编辑操作
- javascript - 选择标签的 SCSS 样式仅在移动设备上不起作用
- python - Tkinter 文本框字体大小
- node.js - 遇到端口问题并将反应/节点项目部署到数字海洋