Django 'distinct' 返回多个值

0 投票
1 回答
1204 浏览
提问于 2025-04-17 10:11

我知道这个话题之前讨论过,但我真的搞不定这个问题... :(

我有一个叫做DeviceLocation的模型:

class DeviceLocation(models.Model):
        device = models.ForeignKey(Device, related_name='locations', null=True, on_delete=models.SET_NULL)
        device_imei = models.CharField(max_length=20)
        user = models.ForeignKey(User, related_name='device_locations', null=True, on_delete=models.SET_NULL)
        user_username = models.CharField(max_length=30, null=True)
        timestamp = models.DateTimeField()
        latitude = models.FloatField()
        longitude = models.FloatField()
        accuracy = models.FloatField()
        speed = models.FloatField()

我想要获取每个不同设备在最近5分钟内的最后一个位置。所以我试了这个:

time_now = datetime.now()
time_from = time_now.replace(minute=time_now.minute - 5)
last_device_locations = DeviceLocation.objects.filter(timestamp__range=(time_from, time_now)).distinct('device')

问题是,distinct这个功能没有正常工作... 它给我返回了同一个设备的多个结果。

我在网站上查找了一下,发现可以用values来解决这个问题,不过我还是搞不定:

DeviceLocation.objects.filter(timestamp__range=(time_from, time_now)).values('device', 'timestamp').order_by('device').distinct('device')

但这还是不行... :( 有什么提示吗?

谢谢!

1 个回答

0

你可以试试这个:

DeviceLocation.objects.filter(timestamp__range=(time_from, time_now)).order_by('device', '-timestamp').distinct('device')

我不太确定,但可能是因为 .values() 这个调用和 select distinct 有关系。

另外,你还需要在 .order_by() 里加上 '-timestamp',这样才能确保你得到每个设备最新的位置。

撰写回答