2009-08-22 55 views
2

如果我有Django的 - 如何獲得只有2場的組合對象與查詢集

Model.objects.all() 

我想只有一個對象的任何content_object = FOO,OBJECT_ID = N。我怎樣才能做到這一點?假設我正在通過-datetime進行訂購。如果我可以在任何content_type = foo,object_id = N的查詢集中只有一個對象...它應該是最新的..如何指定我只想要1個對象的任何組合的content_object和object_id?

class CheckIn(models.Model): 
    ... 
    owner = models.ForeignKey('auth.User') 
    datetime = models.DateTimeField(editable=False, auto_now=True) 

    ... 
    # This is the object that should be geocoded, hopefully 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey() 

    class Meta: 
     ordering=('-datetime',) 

然後採取查詢集:

checkins = CheckIn.objects.filter(
     datetime__gte=datetime.datetime.now() - 
     datetime.timedelta(hours=24), 
) 

這可以給我所有的簽入的過去24小時內,但我只想要1個對象PER CONTENT_TYPE = foo和OBJECT_ID = N。

+0

我想你可能會尋找更好獨特的支持,這是當前不可用,但有它補丁: HTTP: //code.djangoproject.com/ticket/6422 – mikl 2009-08-22 08:32:45

回答

3

你想查找最新的型號對象經過一些過濾?對象ID是什麼意思?它是一個外鍵嗎?或者它是由django自動生成的Model id?我想這是後者。在這種情況下,您只能使用ID。這可能會幫助你(我假設你至少有這些模型中的字段:content_object,的DateField):

Model.objects.filter(content_object=foo,id=N).order_by(dateField)[0] 

編輯:

我道歉。那麼,這個問題不是這個明確的開頭(和我am一個newb)。這裏是一個天真的做法(我想你想不同):

d={} 
[d.setdefault(str(a.content_type)+str(a.object_id),a) for a in checkins ] 
d.values() # this gives your desired list of distinct objects 
+3

爲此添加一個長度檢查,否則如果它不匹配任何對象,它將炸燬。 – 2009-08-22 08:18:59

+0

很好,這確實是現在最好的答案。如果有更有效的方法(不是把所有東西放在內存/ python_objects中),它會更好。但是,回來的解決方案,謝謝。 – 2009-08-23 15:29:33