Django Rest框架结合了2个查询

2024-07-07 08:07:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有机器模型,假设机器有不同的状态,如生产、维护、挂起等。我想通过调用http://127.0.0.1:8000/api/machinestatus/?machines=2,7构建一个api来响应最新的机器状态 此端点应响应计算机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”都会用对应的最新机器状态的结果调用queryset,但问题是如何在for循环中组合这些queryset?多谢了

或者有没有其他更好的方法来实现这一点?
我尝试过machine\uuu in=machine without for loop,但由于我没有使用progresql,所以不能使用distinct(“machine”)。你知道吗

谢谢你的帮助


Tags: self机器falsetimemodels状态machinenull
2条回答

我的建议是创建一个包含id、machine\u id、last\u status的sql视图。 然后创建一个模型并将其连接到这个sql视图,并在机器和最后一个机器状态之间建立一个链接。你知道吗

你可以用where in

# first make the distinct by converting it to a set
machine_ids = list(set(self.request.query_params.get('machines')))
queryset = MachineStatus.objects.filter(machine_id__in = machine_ids).order_by('-upt_time')[:1]

相关问题 更多 >