我不知道該怎麼做......這似乎很簡單,但我無法做到......請給我一個提示。這裏是模型: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
;我嘗試了不同的組合和不使用轉義字符,但沒有任何工作......所以我需要一些更多的建議。 謝謝
問題解決!仔細閱讀django文檔,我發現有一個select_params(params不是)必須使用...現在SQL查詢是好的 – Attilio