【发布时间】:2020-02-20 15:35:15
【问题描述】:
我有 3 个模型,Run、RunParameter、RunValue:
class Run(models.Model):
start_time = models.DateTimeField(db_index=True)
end_time = models.DateTimeField()
class RunParameter(models.Model):
parameter = models.ForeignKey(Parameter, on_delete=models.CASCADE)
class RunValue(models.Model):
run = models.ForeignKey(Run, on_delete=models.CASCADE)
run_parameter = models.ForeignKey(RunParameter, on_delete=models.CASCADE)
value = models.FloatField(default=0)
class Meta:
unique_together=(('run','run_parameter'),)
Run 可以有一个 RunValue,它是一个浮点值,其值的名称来自 RunParameter(基本上是一个包含名称),例如:
RunValue 可以是 AverageTime 或 MaximumTemperature
然后,Run 可以具有值为 X 的 RunValue = RunParameter:AverageTime。
另一个 Run 实例可能有 RunValue = RunParameter:MaximumTemperature 值为 Y 等。
我创建了一个端点来查询我的 API,但我只有 RunParameter ID(因为您可以选择要绘制的参数的方式),而不是 RunValue强> ID直接。我基本上显示了所有 RunParameter 的列表和所有 Run 实例的列表,因为如果我显示 RunValue 的所有实例,列表也会冗长且令人困惑,因为您不会看到“最高温度”:
“运行 X 的最高温度”
“运行 Y 的最高温度”
“运行 Z 的最高温度”等(重复 50 次以上)。
我的 API 视图如下所示:
class RunValuesDetailAPIView(RetrieveAPIView):
queryset = RunValue.objects.all()
serializer_class = RunValuesDetailSerializer
permission_classes = [IsOwnerOrReadOnly]]
序列化器看起来像这样:
class RunValuesDetailSerializer(ModelSerializer):
run = SerializerMethodField()
class Meta:
model = RunValue
fields = [
'id',
'run',
'run_parameter',
'value'
]
def get_run(self, obj):
return str(obj.run)
以及网址以防万一:
url(r'^run-values/(?P<pk>\d+)/$', RunValuesDetailAPIView.as_view(), name='values_list_detail'),
由于我是 REST API 的新手,所以到目前为止,我只处理了我直接查询的模型 API 视图的 ID,但从未处理过相关字段的 ID。我不确定在哪里修改我的查询集以将 ID 传递给它以从相关字段中获取适当的模型实例。
在我进行 API 查询时,我有 Run 实例 ID 和 RunParameter ID。我需要查询集是:
run_value = RunValue.objects.get(run=run_id, run_parameter_id=param_id)
到目前为止,我只需要做类似的事情:
run_value = RunValue.objects.get(id=value_id) # I don't have this ID
【问题讨论】:
标签: python django rest django-rest-framework django-queryset