【问题标题】:Django Rest Framework combine 2 queriesDjango Rest Framework 结合了 2 个查询
【发布时间】: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


    【解决方案1】:

    你可以使用 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]
    

    【讨论】:

      【解决方案2】:

      我的建议是制作一个包含 id、machine_id、last_status 的 sql 视图。 然后创建一个模型并将其连接到这个 sql 视图,并在机器和最后的机器状态之间建立一个链接。

      【讨论】:

        猜你喜欢
        • 2020-04-27
        • 2017-06-04
        • 1970-01-01
        • 1970-01-01
        • 2022-11-13
        • 2018-09-24
        • 1970-01-01
        • 2020-06-24
        相关资源
        最近更新 更多