Как удалить результаты с одинаковым значением с помощью 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)

Можно ли отправить только различные результаты?

если вы ищете способ возвращать разные значения вашего набора запросов, в django есть хороший метод на наборе запросов с удобным названием distinct. вот документация по его использованию.

django distinct

Вернуться на верх