django - 如何使用 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。这是有关如何使用它的文档。
推荐阅读
- c# - 我应该使用 isDbNull 吗?在这种特殊情况下如何使用它?
- public-key-encryption - 使用 2 个公钥加密
- javascript - JavaScript 单击布尔值以选择和取消选择 svg 元素。
- javascript - 在 SAPUI5 按钮上仅按一次 firePress
- javascript - 尝试集成贝宝时的ajax冲突
- hugo - 使用布局时 Hugo 页面不呈现
- javascript - 表单验证 - html 和 javascript
- python - 在 Linux 上创建线程与进程的开销
- javascript - 模块构建失败:未知单词 (2:9) | bundle/webpack 的问题(react、redux、js、node)
- spring-boot - 使用 Spring Boot 和 Thymeleaf 将 URL 映射到 .html 扩展名