首页 > 解决方案 > 如何使用 django ORM 删除具有相同值的结果?

问题描述

我有一个查询,它返回将在浏览器中显示为折线图的数据。根据选择的时间段,这可能代表相当大量的结果(最大约 25K)。

大多数情况下,这些值不会改变,平均而言,在 25 000 个结果中,我有大约 8000 个不同的值。如果我只返回这 8000 个值而不是 25 0000,我认为这将是一个真正的优化。

我的模型:

class TechnicalData(models.Model):
    name = models.CharField(_('Name'), max_length=80)
    value = models.CharField(_('Value'), max_length=80)
    value_type = models.CharField(_('Value type'), max_length=20)
    date_time = models.DateTimeField(_("timestamp"))
    machine = models.ForeignKey("machine.Machine", 
                               verbose_name = _("machine"),
                               related_name="technical_data_machine",
                               on_delete=models.CASCADE)    

    class Meta:
        verbose_name = _("TechnicalData")
        verbose_name_plural = _("TechnicalDatas")
        ordering = ["-date_time"]

    def __str__(self):
        return self.name

如果“值”字段在给定时间段(日期时间)内没有变化,我想删除“重复/相同”值。

今天我有这样的看法:

class TechnicalDataViewSet(viewsets.ViewSet):
    """
    A simple ViewSet for listing or retrieving technical data.
    """
    permission_classes = [permissions.IsAuthenticated]
    pagination_class = LargeResultsSetPagination

    def list(self, request):
        id_machine = self.request.query_params.get('id_machine')
        name = self.request.query_params.get('name')
        only_last = self.request.query_params.get('only_last')
        names = self.request.query_params.get('name__in')
        
        date_start = self.request.query_params.get('date_start')
        date_end = self.request.query_params.get('date_end')
        queryset = TechnicalData.objects.all()
        
        if id_machine:
            queryset = queryset.filter(machine__id=id_machine)
        if name:
            queryset = queryset.filter(name=name)
        if names:
            names = names.split(',')
            queryset = queryset.filter(name__in=names)
        if date_start:
            queryset = queryset.filter(date_time__date__gte=date_start)
        if date_end:
            queryset = queryset.filter(date_time__date__lte=date_end)
        if only_last:
            queryset = queryset.order_by('name', '-date_time').distinct("name")
        pagination = LargeResultsSetPagination()
        qs = pagination.paginate_queryset(queryset, request)
        serializer = TechnicalDataSerializer(qs, many=True)
        return Response(serializer.data)

是否可以只发送不同的结果?

标签: djangodjango-models

解决方案


如果您正在寻找一种方法来返回查询集的不同值,django 有一个很好的查询集方法,方便地命名为 distinct。这是有关如何使用它的文档。

django 独特的


推荐阅读