2014-05-04 38 views
0

我不知道該怎麼做......這似乎很簡單,但我無法做到......請給我一個提示。這裏是模型:django:order_by和distinct可以;然後order_by另一個領域...如何?

class PointOfInterest(models.Model): 
    name = models.CharField(max_length=100) 
    geom = geomodels.PointField(srid=4326) 
    ... 

class Event(models.Model): 
    venue = models.ForeignKey('PointOfInterest',related_name='events') 
    start = models.DateTimeField() 
    ... 

事件表中包含許多事件,並有可能在同一個PointOfInterest比事件更。我的目標是在我的位置附近選擇從今天開始的前10個活動(過去有明顯的事件)。對於每個PointOfInterest新列表只有一個條目。於是我開始選擇的事件:

from django.db.models import Max, Min 
from datetime import datetime, date, timedelta 
from django.contrib.gis.measure import D 
# this is my place... 
pnt=Point(15.0,43.2) 
# this is the date range... 
start_date = datetime(date.today().year,date.today().month,date.today().day,0,0,0) 
end_date = start_date + timedelta(days=30) 
qs1 = Event.objects.filter(venue__geom__distance_lte=(pnt, D(km=10))) 
qs2 = filter(start__range=(start_date, end_date)) 
qs2 = qs1.filter(start__range=(start_date, end_date)) 

列表現在包含要求的所有事件,但也有一個以上的事件相同的地方......但我只需要一個即將到來。主要的問題是這個列表可能很大,我的最後一步是隻獲得10個即將發生的事件。我試圖使用distinct('venue')但我不能order_by('開始')。所以,我不知道如何着手?

我也試着去周圍的其他方法...

qs1 = PointOfInterest.objects.filter(geom__distance_lte=(pnt, D(km=10))) 
qs2 = qs1.annotate(minDate=Min('events__start')) 
qs3 = qs2.filter(minDate__range=(start_date, end_date)) 

這份名單給我所有的PointOfInterest(在我的案件129 ...而之前的列表給了我137個事件......實際上在選定的查詢中有8個有2個事件的地方,我需要保留每個地方只有即將到來的最後我想order_by('start'),並保留其中只有少數)。

也在這種情況下,我嘗試了很多,但沒有任何工作......任何人都可以幫忙嗎? 感謝

編輯

幾乎沒有。根據EvilX的建議,我改變了選擇,但events__start__range=(start_date, end_date)在地點上運行,所以當我執行他建議的2個額外時,我得到與每個地點相關的第一個事件(如果它在過去)。我不得不稍微改變SQL查詢。第一次嘗試是這樣的:

.extra(select={'event_pk': ' 
    SELECT start  
    FROM app_event_event 
    AS evt 
    WHERE evt.venue_id=app_place_pointofinterest.id AND evt.start >= \'2014/05/04\' 
    ORDER BY start 
    LIMIT 1'}) 

其中工程...然後我試圖按照Django文檔的參數傳遞到SQL查詢是這樣的:

.extra(select={'event_pk': ' 
    SELECT start 
    FROM app_event_event 
    AS evt 
    WHERE evt.venue_id=app_place_pointofinterest.id AND evt.start >= %s 
    ORDER BY start 
    LIMIT 1'}, params=['2014/05/04']) 

但在這裏我得到一個錯誤:StopIteration;我嘗試了不同的組合和不使用轉義字符,但沒有任何工作......所以我需要一些更多的建議。 謝謝

+0

問題解決!仔細閱讀django文檔,我發現有一個select_params(params不是)必須使用...現在SQL查詢是好的 – Attilio

回答

0

嘗試使用額外的和兩個查詢。

points = PointOfInterest.objects.filter(geom__distance_lte=(pnt, D(km=10)), events__start__range=(start_date, end_date)).extra(select={'event_pk': 'SELECT event.id FROM app name_event AS event where event.venue_pk=appname_pointofinterest.id ORDER BY start LIMIT 1'}).extra(select={'event_start': 'SELECT event.start_date FROM app name_event AS event where event.venue_pk=appname_pointofinterest.id ORDER BY start LIMIT 1'}).order_by('event_start')[:10] 
ids = [] 
for point in points: 
    ids.append(point.event_pk) 
events = Event.objects.select_related('venue').filter(pk__in=ids) 
+0

謝謝...但是我又遇到了另一個問題...請參閱編輯的問題。 – Attilio

相關問題