2014-04-29 85 views
1

因此,我有一個SensorType模型,其中SensorReading對象的集合作爲sensorreading_set的一部分(即傳感器類型具有多個傳感器讀數)。我想註釋傳感器類型,給我傳感器讀數與最大ID。即:使用已過濾的相關對象集進行註釋

sensor_types = SensorType.objects.annotate(
       newest_reading_id=Max('sensorreading__id')) 

這很有效,但有一個問題。傳感器讀數有另一個外鍵,Device。我真正想要的是針對給定設備的給定傳感器類型的最高傳感器讀數ID。是否可以將註釋引用傳感器讀數的一個子集,基本相當於SensorReading.objects.filter(device=device)

+0

呃,難道你不能連鎖這兩個? 'SensorReading.objects.filter(設備=裝置).annotate(newest_reading_id =最大( 'sensorreading__id'))'? –

+0

您忘記了傳感器類型。我需要爲每種類型獲取最大ID傳感器讀數,而不是每個傳感器讀數的最大值,所以我不能簡單地使用SensorReading資源進行鏈接。 – user1427661

+0

啊,你說得對!我混淆了你的模型,不是嗎?您可能需要[Q對象](https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects)進行這種查詢。 –

回答

1

過濾完美的作品罰款與相關的對象,和註釋工作完美罰款與這些過濾器。你需要做的是:

from django.db.models import Max 

SensorType.objects.filter(sensorreading__device=device) \ 
        .annotate(newest_reading_id=Max('sensorreading__id')) 

請注意,函數調用的順序很重要。在annotate之前使用filter將只在已過濾的集上註釋,使用annotate之前filter將在完整集上進行註釋,然後進行過濾。此外,在對相關對象進行過濾時,請記住filter(sensorreading__x=x, sensorreading__y=y)將過濾所有條件爲真的傳感器讀數,而.filter(sensorreading__x=x).filter(sensorreading__y=y)將過濾傳感器讀數,其中任一條件爲真。

0

據我所知,你想GROUP_BY在兩個字段,device_idsensortype_id。這是可以做到用:

SensorReading.objects.all().values('device_id', 'sensortype_id').annotate(max=Max('id')) 

我沒有嘗試過;它是從SO,this onethis one中的2個不同答案中獲得的。

相關問題