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