【发布时间】:2019-11-20 10:33:20
【问题描述】:
我有机器型号,假设机器有不同的状态,如生产、维护、待定等。我想构建一个 api 来响应最新的机器状态,方法是调用:http://127.0.0.1:8000/api/machinestatus/?machines=2,7 此端点应该响应机器 ID 2 和 7 的状态,我尝试了很多方法但仍然无法使其工作,请帮助
型号:
class MachineStatus(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=False, null=False)
machine = models.ForeignKey(
Machine, on_delete=models.CASCADE, blank=False, null=False)
upt_time = models.DateTimeField(blank=False, null=False)
status = models.CharField(
max_length=1, choices=JOB, blank=False, null=False)
def __str__(self):
return f"{self.machine} {self.upt_time} {self.status}"
class Meta:
verbose_name_plural = "MachineStatus"
序列化器:
class MachineStatusSerializer(serializers.ModelSerializer):
upt_time = serializers.DateTimeField(read_only=True)
status = serializers.CharField(read_only=True)
user = serializers.SlugRelatedField(read_only=True, slug_field='username')
machine = serializers.SlugRelatedField(
read_only=True, slug_field='name')
class Meta:
model = MachineStatus
fields = '__all__'
查看:
class MachineStatusView(viewsets.ModelViewSet):
''' Machine Status View '''
queryset = MachineStatus.objects.all()
serializer_class = MachineStatusSerializer
def get_queryset(self):
queryset = MachineStatus.objects.all()
machines = self.request.query_params.get('machines')
if machines:
machines = machines.split(',')
for i in machines:
queryset = MachineStatus.objects.all()
queryset = queryset.filter(machine=i).order_by('-upt_time')[:1]
\\ question: how to combine queries' result?
return queryset
每个“i”都会调用查询集,结果是对应的最新机器状态,但问题是如何在for循环中组合这些查询集?非常感谢
或者有没有更好的其他方法来实现这一点?
我试过没有 for 循环的 machine__in = machine,但由于我没有使用 progresql,所以我不能使用 distinct("machine")。
感谢您的帮助
【问题讨论】:
标签: python django django-rest-framework