【发布时间】:2021-07-08 01:14:07
【问题描述】:
我有一个 React 应用程序,我在其中使用 Django+REST 作为 API 和后端。在前端,我发送一个 POST 请求来创建一个 Job 模型并运行该作业。在响应中,我检索了新 Job 对象的 ID。
axios.post('http://127.0.0.1:8000/api/jobs/', query)
.then((resp) => {
setActiveJobs([...activeJobs, resp.data.id])
}, (error) => {
console.log(error)
})
当作业完成运行时,它会创建多个通过 ForeignKey 关联的 Result 对象。这是我的两个模型:
class Job(models.Model):
query = models.CharField(max_length=255, blank=True, null=True)
status = models.CharField(max_length=10, blank=True, null=True)
class Result(models.Model):
job = models.ForeignKey(Job, blank=False, null=False, on_delete=models.CASCADE)
result_no = models.IntegerField(blank=False, null=False)
... more fields
我在 Django 中使用 rest_framework 使用Job 的 ID 发送 GET 请求以获取与其关联的所有 Result 的列表时遇到问题。我尝试为retrieve(self, request, pk=None) 和get_queryset(self) 提供自定义实现,但到目前为止我的方法还没有奏效。理想情况下,我想调用诸如localhost:8000/api/results/15 之类的url,其中15 将是创建的Job 的对象ID。如果有 5 个 Result 对象将 job ForeignKey 字段设置为 ID 为 15 的 Job 对象,则响应中将返回这 5 个 Results 的列表。
我解析的views.py和urls.py如下:
views.py
class ResultsView(viewsets.ModelViewSet):
serializer_class = ResultSerializer
queryset = Result.objects.all()
# one potential solution could be along the lines of this? Does not work tho
def get_queryset(self):
job_id = self.kwargs['pk']
queryset = self.queryset.filter(job = job_id)
return queryset
urls.py
router = routers.DefaultRouter()
router.register(r'results', views.ResultsView, 'my_project')
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include(router.urls)),
# re_path('^api/results/(?P<job>.+)/$', views.ResultsView),
]
我认为尝试将整数 ID 与作为对象的 ForeignKey 字段匹配可能存在问题,但是当我查看 localhost:8000/api/results/ 时,我能够看到 ForeignKey 字段 job 被列为的对象一个普通的整数。
这样的任务有合适的模式吗?
【问题讨论】:
-
retrieve有什么问题?你得到Result对象而不是Job?此外,如果 15 用于localhost:8000/api/results/15中的 Job id,那么使用localhost:8000/api/job/15/results不是更有意义吗?results/15说'我想要结果 id 为 15 的结果对象'
标签: django rest django-rest-framework django-views